如何用另一列均值填充DataFrame列缺失值?遇['MSSubCLass']索引错误
问题解决:['MSSubCLass'] not in index 错误及均值填充优化
错误核心原因
出现['MSSubCLass'] not in index的本质是列名不匹配:
- 检查你的
train_df实际列名,大概率存在拼写误差(比如数据中列名是MSSubClass,但代码里写成了MSSubCLass,注意字母大小写或顺序差异)。 - 可通过
print(train_df.columns)输出所有列名,对比确认是否和代码中引用的列名完全一致,也需排查列名是否带有多余空格。
修复及优化填充方案
方案1:修正列名后复用原逻辑
如果确认列名拼写错误,修正后直接运行你的原代码即可。但硬编码均值的方式维护性差,推荐采用更灵活的自动分组填充方案:
方案2:自动计算分组均值填充(推荐)
无需手动写每个类别的均值,直接通过分组计算后填充,代码简洁且不易出错:
import pandas as pd # 计算每个MSSubCLass对应的LotFrontage均值(可按需保留小数位数) class_mean = train_df.groupby('MSSubCLass')['LotFrontage'].mean().round() # 填充缺失值:用对应类别的均值替换空值 train_df['LotFrontage'] = train_df.apply( lambda row: class_mean[row['MSSubCLass']] if pd.isnull(row['LotFrontage']) else row['LotFrontage'], axis=1 )
方案3:用transform实现高效填充(进阶)
pandas的transform方法可避免循环,更高效完成分组填充:
train_df['LotFrontage'] = train_df.groupby('MSSubCLass')['LotFrontage'].transform( lambda x: x.fillna(x.mean().round()) )
注意事项
- 填充前需确认
MSSubCLass列无缺失值,可通过train_df['MSSubCLass'].isnull().sum()检查,否则分组会遗漏对应行。 - 若不需要取整,可去掉
round()保留原始均值。
内容的提问来源于stack exchange,提问作者Abuchi
相关产品推荐
相关产品推荐

