python - 如何在熊猫数据框中找到每一行的顶列值
问题描述
对于具有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 |
有没有更简单的方法来实现这个。矢量化格式有助于显着减少大型数据帧的处理时间
谢谢
解决方案
第一个想法是比较每行的前 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
推荐阅读
- database - 物联网设备数据数据库
- javascript - 带有 UrlfetchApp.fetchAll() 或 async/ 等待多个 http 请求的谷歌应用程序脚本?
- c++ - 将 .exe 文件嵌入到 C++ 程序中?
- pdf - 如何使用 ASP.NET Core MVC 创建自己的 pdf 文件?
- reactjs - 无法将道具传递给材质 ui makeStyles
- pdf - 通过 Itext 5.5.5 签署文档时不符合 PDF/A
- ajax - WordPress - 使用 ajax 和 admin-ajax.php 获取服务器时间
- python-3.x - 熊猫分组并将行转换为多列
- javascript - 为什么一个字符串中的这个数值在其他字符串之间会变成一个字符串?
- reactjs - 只是想找出使用 useReducer + context hooks 的最佳实践