如何用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
相关产品推荐
相关产品推荐

