如何通过双索引groupby均值映射填充DataFrame收入列的NA缺失值
双索引分组均值填充空值实现方法
你原来的写法无法生效的核心原因是:map仅支持单值映射,双索引聚合结果的键是(income_type, education)格式的元组,需要先完成行维度的双字段匹配对齐才能填充。
下面是两种可直接落地的实现方案:
方案1:groupby.transform 一步完成(最简洁)
如果不需要单独留存分组均值结果,直接用transform方法即可自动对齐原DataFrame的索引,不需要额外处理映射关系:
df['total_income'] = df['total_income'].fillna( df.groupby(['income_type', 'education'])['total_income'].transform('mean') )
transform会把分组聚合得到的均值,自动按分组规则还原成和原DataFrame行数一致的序列,空值位置会自动匹配对应分组的均值填充。
方案2:复用已计算好的双索引均值
如果你已经提前计算好了income_means这个双索引聚合结果,可以通过构造元组索引完成匹配:
# 若你的income_means是带多级列名的DataFrame,先执行这行转为双索引Series # income_means = income_means.droplevel(0, axis=1).squeeze() # 构造双字段元组匹配映射,填充空值 fill_dict = income_means.to_dict() df['total_income'] = df['total_income'].fillna( df.set_index(['income_type', 'education']).index.map(fill_dict) )
注意事项
- 匹配前需要确保
income_type、education两个分组字段没有空值,否则会出现匹配失败的情况,如果这两个字段存在空值,建议先填充为统一的默认分类(如未知)后再做分组聚合和匹配。 - 如果存在某组
(income_type, education)的所有样本total_income都为空的情况,该组的均值也会为空,填充后对应位置仍会保留空值,需要提前做好异常分支处理。
内容的提问来源于stack exchange,提问作者Digital Moniker
相关产品推荐
相关产品推荐

