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

如何通过groupby按国家分组均值填充DataFrame中的NaN值?

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

我有一个包含大量NaN值的数据集,其中Country列存在需要保留的重复值。希望按Country列分组,计算每个国家其他列(Total、Coal、per capita等)的均值,并用这些均值填充原DataFrame中的NaN值,请问是否有可行的实现方法?

我尝试了两段代码但都无法实现需求:

第一段代码:

countryunique = df['Country'].unique()
dc = df.groupby('Country').mean().reset_index()

for b in dc['Country']:
    for i in countryunique:
        if (b == i):
            df['Total'] = df.fillna(dc['Country'][b])

第二段代码:

for col in df.columns:
    if col != 'Country' and col !='ISO 3166-1 alpha-3' and col!='Year':
        df[col] = df[col].fillna(str(df[col].mean()))

可行实现方法

不需要复杂循环,用Pandas的groupby结合transform可以高效完成需求,代码如下:

# 筛选需要填充的列(排除不需要计算均值的列)
cols_to_fill = [col for col in df.columns if col not in ['Country', 'ISO 3166-1 alpha-3', 'Year']]

# 按国家分组,用每组的均值填充对应组内的NaN
df[cols_to_fill] = df.groupby('Country')[cols_to_fill].transform(
    lambda group: group.fillna(group.mean())
)

原代码问题分析

  1. 第一段代码:

    • 嵌套循环逻辑冗余,且fillna传入的是国家名称而非对应列的均值,填充逻辑完全错误;
    • 直接赋值给df['Total']会覆盖整列数据,不符合需求。
  2. 第二段代码:

    • 使用了整个列的全局均值而非按国家分组的均值,无法体现不同国家的数值差异;
    • 错误地将均值转为字符串,导致数值列类型变为字符串,后续无法进行正常数值计算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 19:20:26