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

如何用Pandas将指定列的Null值替换为对应列非Null值的均值?

按国家分组用均值填充NaN的正确实现方法

问题背景

数据集包含country、coal_prod_change_pct、gas_prod_change_pct、year列,其中coal_prod_change_pct和gas_prod_change_pct存在Null值,需要按country分组,用每组对应列的非Null值均值填充NaN。数据集样例:

country  coal_prod_change_pct  year  gas_prod_change_pct
490               Ukraine              2.737000  2018             1.463000
491               Ukraine             -2.299000  2019            -0.481000
492               Ukraine             -4.111211  2020             1.197368
493  United Arab Emirates                   NaN  2001             2.553000
494  United Arab Emirates                   NaN  2002            10.239000
495  United Arab Emirates                   NaN  2003             3.227000
496  United Arab Emirates                   NaN  2004             3.349000
497  United Arab Emirates                   NaN  2005             3.240000
498  United Arab Emirates                   NaN  2006             2.092000
499  United Arab Emirates                   NaN  2007             3.074000
500  United Arab Emirates                   NaN  2008            -0.099000

尝试了两种分组填充方法,但第二种apply方式没有inplace=True参数,不知道如何正确实现:

country_grp = sample_df.groupby('country')

# 方法一
country_grp['coal_prod_change_pct'].fillna(country_grp['coal_prod_change_pct'].mean())

# 方法二
country_grp['coal_prod_change_pct'].apply(lambda x: x.fillna(x.mean()))

解决方案

1. 单列处理:赋值回原DataFrame

apply方法会返回一个新的Series,不会修改原数据,直接将结果赋值给原DataFrame的对应列即可完成填充:

sample_df['coal_prod_change_pct'] = sample_df.groupby('country')['coal_prod_change_pct'].apply(lambda x: x.fillna(x.mean()))

2. 多列批量处理:用transform更高效

如果需要同时处理coal_prod_change_pct和gas_prod_change_pct两列,使用transform方法更简洁高效——它会自动返回与原DataFrame索引对齐的结果,无需额外处理索引匹配:

# 指定需要填充的目标列
cols_to_fill = ['coal_prod_change_pct', 'gas_prod_change_pct']

# 分组后用transform批量填充均值
sample_df[cols_to_fill] = sample_df.groupby('country')[cols_to_fill].transform(lambda x: x.fillna(x.mean()))

补充:为什么方法一不生效?

第一种方法中,country_grp['coal_prod_change_pct'].mean()返回的是每个国家的均值(一个Series),但fillna无法直接将这个Series与分组后的每个子数据框对齐,导致填充逻辑无效。而apply和transform都是针对每个分组单独计算均值并填充,能保证数据的正确匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 06:20:27