pandas使用df.iterrows()条件判断不生效无法修改原DataFrame怎么办?
问题原因
你编写的代码不生效的核心原因是pandas的iterrows()方法返回的每一行row是原数据的副本,而非指向原DataFrame的视图,你对row对象的修改只会作用于这个临时的副本对象,不会同步到原DataFrame上,因此看不到修改效果。
可行实现方案
方案1:矢量化操作(优先推荐)
用pandas原生的矢量化字符串方法+布尔索引实现,性能远高于循环遍历,代码如下:
import pandas as pd d = {'col1': ['a:b', 'ac'], 'col2': ['z 26', 'y 25']} df = pd.DataFrame(data=d) # 构造筛选条件:col1包含冒号的行,na=False避免空值报错 mask = df['col1'].str.contains(':', na=False) # 先修改col2(注意要在修改col1之前操作,避免col1被覆盖后丢失原始值) df.loc[mask, 'col2'] = df.loc[mask, 'col1'].str.split(':').str[1] + ' in Person' # 再修改符合条件行的col1值为j df.loc[mask, 'col1'] = 'j' print(df)
运行后输出和预期完全一致。
方案2:修正iterrows循环写法
如果你坚持要用循环实现,不要修改临时的row对象,而是通过索引直接修改原DataFrame,代码如下:
import pandas as pd d = {'col1': ['a:b', 'ac'], 'col2': ['z 26', 'y 25']} df = pd.DataFrame(data=d) df['col1'] = df['col1'].astype(str) df['col2'] = df['col1'].astype(str) for i, row in df.iterrows(): if ":" in row['col1']: # 直接通过行索引i修改原df df.loc[i, 'col2'] = row['col1'].split(":")[1] + " in Person" df.loc[i, 'col1'] = 'j' print(df)
该方案仅适合小数据量场景,数据量超过1万行时性能会明显低于矢量化方案。
内容的提问来源于stack exchange,提问作者vishvas chauhan
相关产品推荐
相关产品推荐

