使用Pandas按OverallQual均值填充SalePrice空值时apply函数报KeyError:nan
问题分析与修正方案
错误原因拆解
- 逻辑错误:当
SalePrice为空时,你错误地用空值SalePrice去索引分组后的均值序列sale_price_by_qual,但这个序列的索引是OverallQual的数值,根本不存在nan这个键,直接触发KeyError。正确逻辑应该用当前行的OverallQual值去取对应分组的平均售价。 - 拼写/语法错误:
x['SalePrice]缺少闭合单引号,应为x['SalePrice']OverallQaul拼写错误,正确列名是OverallQualdf[SalePrice]列名未加引号,Python会把它当成变量而非列名,应为df['SalePrice']
修正后的代码
import numpy as np # 先按OverallQual分组计算平均售价 sale_price_by_qual = df.groupby('OverallQual')['SalePrice'].mean() def fill_sales_price(SalePrice, OverallQual): if np.isnan(SalePrice): # 用当前行的OverallQual取对应分组均值 return sale_price_by_qual[OverallQual] else: return SalePrice # 修正所有拼写和语法问题 df['SalePrice'] = df.apply(lambda x: fill_sales_price(x['SalePrice'], x['OverallQual']), axis=1)
更高效的替代方案
apply逐行处理效率较低,尤其面对大数据集时,推荐用map结合fillna的方式实现,代码更简洁且性能更好:
sale_price_by_qual = df.groupby('OverallQual')['SalePrice'].mean() df['SalePrice'] = df['SalePrice'].fillna(df['OverallQual'].map(sale_price_by_qual))
内容的提问来源于stack exchange,提问作者rileylivingston
相关产品推荐
相关产品推荐

