使用iterrows为Pandas DataFrame赋值无效问题求助
问题原因与解决方案
为什么你的循环没生效?
用iterrows()遍历DataFrame时,每次迭代返回的row是原数据行的副本,不是对原DataFrame的直接引用。你修改row['col4']只是改动了这个临时副本,原DataFrame的col4不会受到影响。
推荐的解决方案(优先用向量化操作)
Pandas的设计初衷是用向量化操作替代循环,效率更高且代码更简洁,这里有两种最优写法:
方法1:通过loc按条件批量赋值
直接定位符合条件的行和列,批量完成赋值:
df.loc[df['col2'] == 1, 'col4'] = df['col3'] * 3 df.loc[df['col2'] == 2, 'col4'] = df['col3'] * 2 df.loc[df['col2'] == 3, 'col4'] = df['col3'] * 1
方法2:用映射关系简化逻辑
先定义col2对应的乘数映射,再通过map匹配乘数后与col3相乘:
multiplier_map = {1: 3, 2: 2, 3: 1} df['col4'] = df['col2'].map(multiplier_map) * df['col3']
这种写法扩展性更强,后续如果新增col2的取值,只需要修改映射字典即可。
如果一定要用循环(不推荐大数据场景)
如果坚持用循环实现,需要通过索引i定位原DataFrame的行进行修改,同时把多个if改成elif减少冗余判断:
for i, row in df.iterrows(): if row['col2'] == 1: df.loc[i, 'col4'] = row['col3'] * 3 elif row['col2'] == 2: df.loc[i, 'col4'] = row['col3'] * 2 elif row['col2'] == 3: df.loc[i, 'col4'] = row['col3'] * 1
内容的提问来源于stack exchange,提问作者E_Sarousi
相关产品推荐
相关产品推荐

