如何通过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()) )
原代码问题分析
第一段代码:
- 嵌套循环逻辑冗余,且
fillna传入的是国家名称而非对应列的均值,填充逻辑完全错误; - 直接赋值给
df['Total']会覆盖整列数据,不符合需求。
- 嵌套循环逻辑冗余,且
第二段代码:
- 使用了整个列的全局均值而非按国家分组的均值,无法体现不同国家的数值差异;
- 错误地将均值转为字符串,导致数值列类型变为字符串,后续无法进行正常数值计算。
内容的提问来源于stack exchange,提问作者Fateme Aryaie
相关产品推荐
相关产品推荐

