You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于另一DataFrame分组统计量填充缺失值(不用apply/map)

用另一DataFrame的分组统计量高效填充缺失值

问题场景

需要用df2中catvar分组后的numvar_original均值,填充df1中对应分组的numvar_original缺失值,且要求避免使用apply/map+字典这类大数据集下效率较低的方法。

示例数据

df1:

catvarnumvar_originalnumvar_ideal
11010
1NaN5.5
23030
2NaN6.5

df2:

catvarnumvar_original
15
16
26
27

原代码问题分析

  • 第一种尝试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列会被正确填充为:

catvarnumvar_originalnumvar_ideal
11010
15.55.5
23030
26.56.5

内容的提问来源于stack exchange,提问作者Marsha T

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 04:32:48