使用iterrows循环修改Pandas DataFrame时数据未同步问题求助
问题解析:为什么循环内修改了行值,但原DataFrame没变化?
嗨,我来帮你弄明白这个问题~ 你遇到的情况其实是Pandas里iterrows()的一个常见小坑:
核心原因
iterrows()返回的每一行row是原DataFrame的副本,而不是对原数据的直接引用。也就是说,你在循环里修改row['Serial Number'],只是改了这个临时生成的副本对象,完全没触碰到原DataFrame里的真实数据,所以循环结束后原DataFrame的值自然没变化。
解决方案1:用.loc直接修改原DataFrame
如果你坚持要用循环的方式实现,得通过索引直接定位到原DataFrame的对应位置修改,而不是修改副本:
import pandas as pd a = pd.read_excel('C:/Users/HP/Desktop/WFH/PowerBI/CMM data.xlsx', 'CMM_unclean') a['Serial Number'] = a['Serial Number'].apply(str) print(a.iloc[72,1]) for index, row in a.iterrows(): if len(row['Serial Number']) == 6: # 用.loc直接定位原DataFrame的行和列进行修改 a.loc[index, 'Serial Number'] = 'SR0' + row['Serial Number'] print(a.loc[index, 'Serial Number']) print(a.iloc[72,1])
解决方案2:更高效的矢量化操作(推荐)
Pandas的设计核心就是尽量避免循环,用矢量化操作不仅代码更简洁,处理大数据的效率也会高很多。你可以用字符串方法结合条件赋值来批量处理:
import pandas as pd a = pd.read_excel('C:/Users/HP/Desktop/WFH/PowerBI/CMM data.xlsx', 'CMM_unclean') a['Serial Number'] = a['Serial Number'].astype(str) # 生成条件掩码,筛选出长度为6的Serial Number mask = a['Serial Number'].str.len() == 6 # 对符合条件的行批量添加前缀 a.loc[mask, 'Serial Number'] = 'SR0' + a.loc[mask, 'Serial Number'] print(a.iloc[72,1])
这样修改后,原DataFrame的值会直接更新,而且代码更符合Pandas的使用习惯哦。
内容的提问来源于stack exchange,提问作者Saurabh Arya
相关产品推荐
相关产品推荐

