python - 使用 Pandas 根据多个条件获取列名称

标签 python pandas

我有以下数据框:

    c1  e  c2   d   s  scr_s  scr_c1  scr_d  scr_c2  scr_e  r1     r2
12  6   13  3   2   11    22      19      5       5     19  scr_s  scr_d    
13  11  2   6   13  3      9      24     15       9     13  scr_c1 scr_s    

我正在尝试获取评估列的最大值和最小值的列的名称​​scr_s、scr_c1、scr_d、scr_c2、scr_e。因此具有最高值的列名称将存储在r1 和具有最低值的列名称将存储在 r2

为了计算 r1 和 r2,我使用:

data['r1'] = data[['scr_s','scr_c1','scr_d','scr_c2','scr_e']].idxmax(axis=1)
data['r2'] = data[['scr_s','scr_c1','scr_d','scr_c2','scr_e']].idxmin(axis=1)

问题:当两列具有相同的最大值或最小值时,我必须选择具有最大值的列名称此列之一'c1','e','c2','d','s'

在这种特殊情况下,当分析 r2 列时,结果应该不同:

  • 对于第一行,列 scr_dscr_c2 共享相同的最小值,因此列 'd' 和 'c2' 应该进行评估。在列 'd 和 c2' 之间,最高值属于 'c2',因此 r2 的预期结果为 scr_c2.

如何解决这个问题?

预期输出:

    c1  e  c2   d   s  scr_s  scr_c1  scr_d  scr_c2  scr_e  r1     r2
12  6   13  3   2   11    22      19      5       5     19  scr_s  *scr_c2*  
13  11  2   6   13  3      9      24     15       9     13  scr_c1 *scr_c2*

最佳答案

创建相对相关的列名称列表

base = ['c1', 'e', 'c2', 'd', 's']
extd = [f'scr_{c}' for c in base]

创建这些列的元组列表

base_tups = [*zip(*map(df.get, base))]
extd_tups = [*zip(*map(df.get, extd))]

将这些元组压缩在一起

zvals = [[*zip(*t)] for t in zip(extd_tups, base_tups)]

看起来像这样

[[(19, 6), (19, 13), (5, 3), (5, 2), (22, 11)],
 [(24, 11), (13, 2), (9, 6), (15, 13), (9, 3)]]

设置 idxmax/idxmin 类型事物

r = range(len(base))

rvals = {}

rvals['r1'] = [extd[max(r, key=lambda i: x[i])] for x in zvals]
# flip sign on second element to get what OP wants v
rvals['r2'] = [extd[min(r, key=lambda i: (x[i][0], -x[i][1]))] for x in zvals]

df.assign(**rvals)

    c1   e  c2   d   s  scr_s  scr_c1  scr_d  scr_c2  scr_e      r1      r2
12   6  13   3   2  11     22      19      5       5     19   scr_s  scr_c2
13  11   2   6  13   3      9      24     15       9     13  scr_c1  scr_c2

关于python - 使用 Pandas 根据多个条件获取列名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56173614/

相关文章:

python - 替代正则表达式来匹配前两个破折号之间的所有文本

python - pip安装后如何启用mod_wsgi

python - 将行值分组为 Pandas 中的列

python - 如何使用 Pandas 在时间序列中查找连续的相同数据

python 从数据集中删除特殊值

python - python 中更新周数的函数

python - 回到基础 : Scrapy

python - 组合两个数据帧时保留索引

Python解析然后放入数据框

python - 如何在 x86_64 主机上使用 Setup.py 构建 32 位 Python 模块分发