Pandas多列替换失效:保留全量DataFrame并实现均值插补
解决方案
问题原因分析
- 第一个代码块:你将
df直接赋值为目标列的子集,导致原DataFrame中未指定的列(如Pregnancies)被直接丢弃。 - 第二个代码块:
df[target_cols]在Pandas中可能返回原DataFrame的副本而非视图,此时使用inplace=True修改的是副本,原df完全不受影响。
正确实现代码
直接针对原DataFrame的目标列进行操作,既保留所有列,又完成0值替换与均值插补:
import numpy as np # 定义需要处理的目标列 target_cols = ['Glucose','BloodPressure','SkinThickness','Insulin','BMI','Age'] # 1. 将目标列中的0替换为NaN,直接修改原df的对应列 df[target_cols] = df[target_cols].replace(0, np.NaN) # 2. 用各目标列的均值填充NaN df[target_cols] = df[target_cols].fillna(df[target_cols].mean())
另一种更灵活的实现(apply方法)
如果需要对每列做更复杂的逻辑处理,可以用apply:
target_cols = ['Glucose','BloodPressure','SkinThickness','Insulin','BMI','Age'] def process_col(col): # 替换0为NaN后用均值填充 col = col.replace(0, np.NaN) return col.fillna(col.mean()) df[target_cols] = df[target_cols].apply(process_col)
关键注意事项
- 避免盲目使用
inplace=True:当不确定变量是视图还是副本时,直接赋值的方式更可靠,也更易读。 - 验证目标列的0值有效性:确认
Age等列的0确实是无效值(皮马数据集中Age无0值,此操作安全)。
内容的提问来源于stack exchange,提问作者29nivek
相关产品推荐
相关产品推荐

