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

pandas如何用iterrows()修改DataFrame值并按行条件设置0/1标记

问题原因

  • 你通过iterrows()遍历得到的row是原DataFrame行数据的只读副本,对row的修改不会同步到原DataFrame,所以赋值操作全部无效
  • 函数内的return语句缩进错误,位于for循环内部,第一次循环执行完成后就会直接返回数据,后续所有行都不会被处理

最优实现方案

Pandas的向量化操作远快于逐行遍历,完全不需要写循环,直接通过布尔条件批量赋值即可,代码如下:

# 直接按条件批量赋值,自动应用到每一行
df['heating_mode'] = (df['heating_sig'] > 0).astype(int)
df['econ_mode'] = ((df['economizer_sig'] > ahu_min_oa) & (df['cooling_sig'] == 0)).astype(int)
df['econ+mech_cooling'] = ((df['economizer_sig'] > ahu_min_oa) & (df['cooling_sig'] > 0)).astype(int)
df['mech_cooling'] = ((df['economizer_sig'] <= ahu_min_oa) & (df['cooling_sig'] > 0)).astype(int)

如果要封装成函数,写法如下:

def data_preprocess(df, ahu_min_oa=0.2):
    df = df.copy() # 不需要修改原数据可以删掉这行
    df['heating_mode'] = (df['heating_sig'] > 0).astype(int)
    df['econ_mode'] = ((df['economizer_sig'] > ahu_min_oa) & (df['cooling_sig'] == 0)).astype(int)
    df['econ+mech_cooling'] = ((df['economizer_sig'] > ahu_min_oa) & (df['cooling_sig'] > 0)).astype(int)
    df['mech_cooling'] = ((df['economizer_sig'] <= ahu_min_oa) & (df['cooling_sig'] > 0)).astype(int)
    return df

# 调用函数
df = data_preprocess(df)

验证结果

执行完成后再运行统计代码就能看到非0的结果:

print(df['heating_mode'].value_counts())
print(df['mech_cooling'].value_counts())
print(df['econ_mode'].value_counts())
print(df['econ+mech_cooling'].value_counts())

内容的提问来源于stack exchange,提问作者bbartling

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 04:54:00