pandas中用groupby字典填充列NaN未生效问题排查
填充失败核心原因
- 生成的字典结构不符合预期:对groupby聚合输出的DataFrame直接调用
to_dict(),得到的是双层嵌套字典,格式为{'cylinders': {车型名1: 中位数1, 车型名2: 中位数2}},不是{车型名: 对应中位数}的单层映射结构。 - fillna逻辑用错:对
df['cylinders']这个Series调用fillna传入字典时,pandas会按照Series自身的行索引匹配字典键,不会自动关联model列的取值做匹配,自然无法完成对应填充。
正确实现代码
- 生成分组中位数单层映射字典
# 分组后直接取cylinders列得到Series,转字典后就是车型为键、中位数为值的单层结构 cylinders_model_med = df.groupby('model')['cylinders'].median().to_dict()
- 按model列匹配中位数完成空值填充
# 先用map把每行model对应的中位数取出来,再传入fillna完成填充 df['cylinders'] = df['cylinders'].fillna(df['model'].map(cylinders_model_med))
- 校验填充结果
# 输出剩余空值数量 print(df['cylinders'].isna().sum())
补充说明
如果存在某款车型的所有cylinders记录都是空值的情况,该车型映射得到的中位数也为NaN,填充后这部分记录仍为空。可以追加一行全局填充兜底:
# 用全量数据的气缸数中位数填充剩余空值,也可以根据需求换成众数、固定值等 df['cylinders'] = df['cylinders'].fillna(df['cylinders'].median())
内容的提问来源于stack exchange,提问作者hannah_pella
相关产品推荐
相关产品推荐

