如何在Pandas中基于acc_count分组中位数填充avg_spd空值?
用Pandas按分组中位数填充空值的解决方案
嘿,我来帮你搞定这个问题!你已经算出了每个acc_count对应的avg_spd中位数,现在要把原DataFrame里的空值按对应分组填充对吧?这里有两种简单好用的方法:
先回顾下你的分组结果
你用这段代码得到了分组中位数:
df.groupby('acc_count', as_index=False)['avg_spd'].median()
结果是:
| acc_count | avg_spd |
|---|---|
| 0 | 20.94 |
| 1 | 24.42 |
| 2 | 26.035 |
| 3 | 33.27 |
| 4 | 33.46 |
| 5 | 36.07 |
| 6 | 35.03 |
| 7 | 33.49 |
| 8 | 71.85 |
方法一:一步到位用groupby.transform
这是最省心的方法,不需要额外存中间结果,直接生成填充值并替换空值:
# 为每个acc_count分组生成对应中位数的填充序列 median_fill_values = df.groupby('acc_count')['avg_spd'].transform('median') # 填充avg_spd的空值 df['avg_spd'] = df['avg_spd'].fillna(median_fill_values)
为什么这个好用?因为transform('median')会把每个分组的中位数自动匹配到原DataFrame的每一行,生成和原表一样长的Series,fillna直接就能用它替换空值,完全不用手动对应。
方法二:用字典映射填充(适合已经有分组结果的情况)
如果你已经把之前的分组结果存成了DataFrame(比如叫median_df),可以转成字典再填充:
# 假设你已经保存了分组结果到median_df median_df = df.groupby('acc_count', as_index=False)['avg_spd'].median() # 把分组结果转成 {acc_count: 对应中位数} 的字典 median_mapping = median_df.set_index('acc_count')['avg_spd'].to_dict() # 用map匹配每个行的acc_count对应的中位数,然后填充空值 df['avg_spd'] = df['avg_spd'].fillna(df['acc_count'].map(median_mapping))
这种方法的好处是,如果你之后还要重复用这些中位数,字典可以直接复用,不用再重新分组计算。
检查填充效果
最后可以用这句代码确认空值都被处理了:
print(df['avg_spd'].isnull().sum())
如果输出是0,就说明所有空值都按要求填充完成啦!
内容的提问来源于stack exchange,提问作者Girish kumar
相关产品推荐
相关产品推荐

