代码之家  ›  专栏  ›  技术社区  ›  Konstantin

在熊猫数据帧的每列中查找第一个非零值

  •  4
  • Konstantin  · 技术社区  · 6 年前

    获取数据帧每列(从上到下)中第一个非零元素的值和索引的泛泛方法是什么?

    import pandas as pd
    
    df = pd.DataFrame([[0, 0, 0],
                       [0, 10, 0],
                       [4, 0, 0],
                       [1, 2, 3]],
                      columns=['first', 'second', 'third'])
    
    print(df.head())
    
    #    first  second  third
    # 0      0       0      0
    # 1      0      10      0
    # 2      4       0      0
    # 3      1       2      3
    

    我想实现的目标:

    #        value  pos
    # first      4    2
    # second    10    1
    # third      1    3
    
    3 回复  |  直到 6 年前
        1
  •  2
  •   piRSquared    6 年前

    idxmax 它给你最大的第一个位置。但是,您需要找到“不等于零”的最大值。

    df.ne(0).idxmax()
    
    first     2
    second    1
    third     3
    dtype: int64
    

    我们可以把这个和 lookup assign

    df.ne(0).idxmax().to_frame('pos').assign(val=lambda d: df.lookup(d.pos, d.index))
    
            pos  val
    first     2    4
    second    1   10
    third     3    3
    

    相同的答案包装略有不同。

    m = df.ne(0).idxmax()
    pd.DataFrame(dict(pos=m, val=df.lookup(m, m.index)))
    
            pos  val
    first     2    4
    second    1   10
    third     3    3
    
        2
  •  2
  •   jpp    6 年前

    以下是长缠绕方式,如果非零值倾向于出现在大型数组的开头附近,则速度应该更快:

    import pandas as pd
    
    df = pd.DataFrame([[0, 0, 0],[0, 10, 0],[4, 0, 0],[1, 2, 3]],
                      columns=['first', 'second', 'third'])
    
    res = [next(((j, i) for i, j in enumerate(df[col]) if j != 0), (0, 0)) for col in df]
    
    df_res = pd.DataFrame(res, columns=['value', 'position'], index=df.columns)
    
    print(df_res)
    
            value  position
    first       4         2
    second     10         1
    third       3         3
    
        3
  •  2
  •   BENY    6 年前

    我会用 stack ,索引用于行和列的编号。

    df[df.eq(df.max(1),0)&df.ne(0)].stack()
    Out[252]: 
    1  second    10.0
    2  first      4.0
    3  third      3.0
    dtype: float64