如何将pandas iterrows遍历的for循环改写为列表推导式
问题修正方案
1. 原代码逻辑问题
你最初写的for循环本身存在错误:循环内每次赋值都会覆盖df_olym['Medals_team']整列的所有值,最终整列只会保留循环最后一行的计算结果,无法输出每行对应的正确值。
2. 列表推导式写法修正
Python列表推导式不支持你尝试的逗号分隔中间变量赋值语法,你不需要单独声明event/team/year/medal变量,直接从行对象item中取对应字段传入medal_count的key即可,同时要注意处理item.Medal == 0的行的默认值,保证最终生成的列表长度和DataFrame的行数一致,避免赋值报错。
正确写法如下:
df_olym['Medals_team'] = [ item.Medals_Won / medal_count[(item.Event, item.Team, item.Year, item.Medal)] if item.Medal != 0 else 0 # 可根据业务需求修改Medal为0时的默认值,比如替换为pd.NA for i, item in df_olym.iterrows() ]
3. 性能优化建议
iterrows遍历的效率很低,如果你的DataFrame数据量较大,更推荐使用pandas原生的apply方法实现,运行速度会明显提升:
df_olym['Medals_team'] = df_olym.apply( lambda row: row.Medals_Won / medal_count[(row.Event, row.Team, row.Year, row.Medal)] if row.Medal != 0 else 0, axis=1 )
内容的提问来源于stack exchange,提问作者Nighteg
相关产品推荐
相关产品推荐

