Pandas遍历DataFrame新增列存储每行指定列最大值对应列名
原有代码的错误原因
- 第一版循环代码:循环全程没有用到遍历索引
i,每次循环都是给整列emotion赋值,且赋值内容是四个情绪列按列计算的全局最大值(返回长度为4的Series),和原DataFrame行数不匹配,最终整列被填充为NaN。 - 第二版iloc代码:
iloc[3:]是截取从第4行开始的所有行数据,根本不是选中目标列,行列索引方向完全写反,同样是每次给整列重复赋值,逻辑不成立。
正确实现方案
不需要写低效的逐行循环,直接用pandas原生的逐行计算方法即可,运行效率远高于手写循环:
# 定义需要比对的情绪列列表 emotion_columns = ['neutral', 'happy', 'sad', 'angry'] # axis=1 指定按行维度计算,idxmax 直接返回每行最大值对应的列名 df3['emotion'] = df3[emotion_columns].idxmax(axis=1)
运行后你给出的两行示例数据,emotion列都会被正确标注为neutral,完全符合需求。
特殊场景提示:如果某一行存在多个情绪列数值相等且同为最大值的情况,
idxmax会默认返回排在列列表最靠前的列名,如果你需要处理并列最大值的场景,可以基于这个逻辑再补充自定义判断规则,常规无并列的场景下上述代码可以直接使用。
内容的提问来源于stack exchange,提问作者Zoi K.
相关产品推荐
相关产品推荐

