如何基于另一DataFrame分组统计量填充缺失值(不用apply/map)
用另一DataFrame的分组统计量高效填充缺失值
问题场景
需要用df2中catvar分组后的numvar_original均值,填充df1中对应分组的numvar_original缺失值,且要求避免使用apply/map+字典这类大数据集下效率较低的方法。
示例数据
df1:
| catvar | numvar_original | numvar_ideal |
|---|---|---|
| 1 | 10 | 10 |
| 1 | NaN | 5.5 |
| 2 | 30 | 30 |
| 2 | NaN | 6.5 |
df2:
| catvar | numvar_original |
|---|---|
| 1 | 5 |
| 1 | 6 |
| 2 | 6 |
| 2 | 7 |
原代码问题分析
- 第一种尝试
df1['numvar'].fillna(df2.groupby('catvar')['numvar'].transform('mean'), inplace=True)无效:因为transform('mean')返回的是与df2同长度的Series,和df1的索引不匹配,无法对应填充。 - 第二种尝试使用df1自身的分组均值,不符合需求。
高效解决方案
方法1:利用分组均值Series的索引映射(推荐)
通过groupby得到以catvar为索引的均值Series,再用map基于catvar匹配填充——这是向量化操作,效率远高于逐行处理:
# 计算df2的分组均值,得到索引为catvar的Series cat_mean_series = df2.groupby('catvar')['numvar_original'].mean() # 填充df1的缺失值 df1['numvar_original'] = df1['numvar_original'].fillna(df1['catvar'].map(cat_mean_series))
方法2:通过左连接合并均值后填充
先生成分组均值表,再与df1左连接,用合并后的均值列填充:
# 生成分组均值DataFrame group_means = df2.groupby('catvar')['numvar_original'].mean().reset_index(name='cat_mean') # 左连接到df1 df1 = df1.merge(group_means, on='catvar', how='left') # 填充缺失值并清理临时列 df1['numvar_original'] = df1['numvar_original'].fillna(df1['cat_mean']) df1.drop('cat_mean', axis=1, inplace=True)
效果验证
执行后df1的numvar_original列会被正确填充为:
| catvar | numvar_original | numvar_ideal |
|---|---|---|
| 1 | 10 | 10 |
| 1 | 5.5 | 5.5 |
| 2 | 30 | 30 |
| 2 | 6.5 | 6.5 |
内容的提问来源于stack exchange,提问作者Marsha T
相关产品推荐
相关产品推荐

