如何在Pandas中创建列存储排除值1后的最大数值对应列名?
获取数据集中最大非1值的列名
问题分析
你需要为每行创建新列,取值为该行中数值最大且不等于1的列名。原代码存在语法错误(缺少else分支)、参数错误(max的参数应为axis=1而非index=1),且未处理“最大值等于1”时的逻辑——此时需要排除所有值为1的列,再从剩余列中找最大值对应的列名。
解决方案
以下两种方法均可实现需求:
方法1:替换1为缺失值后取idxmax
将所有值为1的单元格替换为pd.NA,这样idxmax会自动忽略这些缺失值,直接返回剩余值中最大值的列名:
import pandas as pd df = pd.DataFrame({'A': [1, 0.2, 0.1, 0], 'B': [0.2, 1, 0, 0.5], 'C': [1, 0.4, 0.3, 1]}, index=['1', '2', '3', '4']) # 创建新列 df['NEWCOL'] = df.replace(1, pd.NA).idxmax(axis=1)
方法2:逐行自定义筛选逻辑
使用apply遍历每行,先筛选出值不等于1的列,再取最大值对应的列名,适合需要更复杂筛选条件的场景:
def get_target_col(row): # 筛选出当前行值不等于1的列 non_one_cols = row[row != 1] # 返回最大值对应的列名 return non_one_cols.idxmax() df['NEWCOL'] = df.apply(get_target_col, axis=1)
结果验证
执行上述代码后,数据集输出如下:
| index | A | B | C | NEWCOL |
|---|---|---|---|---|
| 1 | 1.0 | 0.2 | 1.0 | B |
| 2 | 0.2 | 1.0 | 0.4 | C |
| 3 | 0.1 | 0.0 | 0.3 | C |
| 4 | 0.0 | 0.5 | 1.0 | B |
注:你提供的期望输出中第3行的B值为0.4,与原始数据集的B值0.0不符,上述结果是基于你给出的原始数据集生成的正确结果。
内容的提问来源于stack exchange,提问作者Pietro Bellamio
相关产品推荐
相关产品推荐

