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
相关产品推荐
相关产品推荐

