【问题标题】:How to find the top column values of each row in a pandas dataframe如何在熊猫数据框中找到每一行的顶列值
【发布时间】:2020-08-14 10:35:32
【问题描述】:

对于具有m 列的给定数据框(假设m=10),在每一行中,我试图找到顶部n 列值(假设n=2)。在为每一行找到这些顶部的n 值后,我想将剩余的列值,m - n 在行中分配为 0。

例如,从第一个表中提到的值的数据框开始,我尝试使用前面讨论的过滤选项创建第一个表的表示。如果超过n 列具有相同的值,则优先考虑较低的列索引号

| col_A | col_B | col_C | col_D | col_E |
|-------|-------|-------|-------|-------|
| 0.1   | 0.1   | 0.3   | 0.4   | 0.5   |
| 0.06  | 0.1   | 0.1   | 0.1   | 0.01  |
| 0.24  | 0.24  | 0.24  | 0.24  | 0.24  |
| 0.20  | 0.25  | 0.30  | 0.12  | 0.02  |
| col_A | col_B | col_C | col_D | col_E |
|-------|-------|-------|-------|-------|
| 0     | 0     | 0     | 0.4   | 0.5   |
| 0     | 0.1   | 0.1   | 0     | 0     |
| 0.24  | 0.24  | 0     | 0     | 0     |
| 0     | 0.25  | 0.3   | 0     | 0     |

有没有更简单的方法来实现这个。矢量化格式有助于显着减少大型数据帧的处理时间

谢谢

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    第一个想法是通过Series.nlargest比较每行的前N个值和DataFrame.where的nset值:

    N = 2
    df = df.where(df.apply(lambda x: x.eq(x.nlargest(N)), axis=1), 0)
    print (df)
       col_A  col_B  col_C  col_D  col_E
    0   0.00   0.00    0.0    0.4    0.5
    1   0.00   0.10    0.1    0.0    0.0
    2   0.24   0.24    0.0    0.0    0.0
    3   0.00   0.25    0.3    0.0    0.0
    

    为了提高性能,使用numpy,@Divakar 的解决方案:

    N = 2
    #https://stackoverflow.com/a/61518029/2901002
    idx = np.argsort(-df.to_numpy(), kind='mergesort')[:,:N]
    mask = np.zeros(df.shape, dtype=bool)
    np.put_along_axis(mask, idx, True, axis=-1)
    df = df.where(mask, 0)
    print (df)
       col_A  col_B  col_C  col_D  col_E
    0   0.00   0.00    0.0    0.4    0.5
    1   0.00   0.10    0.1    0.0    0.0
    2   0.24   0.24    0.0    0.0    0.0
    3   0.00   0.25    0.3    0.0    0.0
    

    【讨论】:

    • 这种方法似乎很容易理解。有没有更快的方法?
    • @codecodercoding - 答案已编辑,Divakar 解决方案帮了我很多忙。
    • 谢谢@jezrael。我可以理解第二个代码块中使用的逻辑。非常感谢您对此提供的帮助
    猜你喜欢
    • 2017-04-19
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 2022-12-17
    • 2020-04-10
    • 1970-01-01
    相关资源
    最近更新 更多