首页 > 解决方案 > 如何在熊猫数据框中找到每一行的顶列值

问题描述

对于具有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     |

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

谢谢

标签: pythonpandas

解决方案


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

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

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

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

推荐阅读