You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 13:24:01