如何使用pandas遍历DataFrame列 解决SettingWithCopyWarning及取值错误
问题原因
- 警告触发原因:X3是其他DataFrame切片生成的视图对象,不是独立的DataFrame实例,直接修改视图时pandas无法判断修改目标,因此抛出
SettingWithCopyWarning,且部分修改不会生效,导致最终计算数值错误。 - 原有代码可优化点:直接遍历列的写法执行效率低,且使用
max、min作为变量名会覆盖Python内置函数,存在潜在风险。
正确实现方案
你当前用的是「均值中心化+极差缩放」的归一化逻辑,如果需要标准0-1归一化可以参考代码注释替换逻辑。
方案1:向量化计算(推荐)
pandas支持按列批量向量运算,无需遍历列,代码更简洁高效,不会触发警告:
# 先生成独立的DataFrame副本,解决视图修改问题 X3 = X3.copy() # 按列批量计算均值、最大值、最小值 mean = X3.mean(axis=0) max_val = X3.max(axis=0) min_val = X3.min(axis=0) # 批量执行归一化计算 X3 = (X3 - mean) / (max_val - min_val) # 如果需要标准0-1归一化,替换为下方代码即可 # X3 = (X3 - min_val) / (max_val - min_val)
方案2:遍历列实现(兼容原有写法)
如果需要保留遍历的写法,可按如下方式修改,避免警告:
# 先生成独立的DataFrame副本,解决视图修改问题 X3 = X3.copy() # 显式遍历列名,用loc方法赋值避免警告 for column in X3.columns: mean = np.mean(X3[column]) max_val = np.max(X3[column]) min_val = np.min(X3[column]) X3.loc[:, column] = (X3[column] - mean) / (max_val - min_val)
内容的提问来源于stack exchange,提问作者Hizafa
相关产品推荐
相关产品推荐

