Pandas:在分组DataFrame中为特定行应用均值填充NaN
用分组均值填充DataFrame中的NaN值
我太懂这个困扰了!想用每个gameweek分组的均值来填充对应组里的NaN,其实只需要把groupby和transform搭配起来用就行,完美解决「按组计算后映射回原位置」的需求。
先给你一个完整的示例,先模拟一个类似你的DataFrame:
import pandas as pd import numpy as np # 模拟你的数据结构 df = pd.DataFrame({ 'gameweek': [1,1,1,2,2,2,3,3,3], 'points': [12, np.nan, 18, np.nan, 25, 22, 30, np.nan, np.nan], 'goals': [1, np.nan, 2, np.nan, 0, 1, 2, np.nan, np.nan] })
单列处理
如果只需要处理某一列(比如points),核心代码是这样的:
# 按gameweek分组计算points列的均值,并用这个均值填充对应组的NaN df['points'] = df['points'].fillna(df.groupby('gameweek')['points'].transform('mean'))
多列批量处理
如果你的DataFrame有多个数值列需要处理,直接用groupby+transform后批量填充:
# 对所有数值列,用对应gameweek分组的均值填充NaN df = df.fillna(df.groupby('gameweek').transform('mean'))
为什么这个方法有效?
transform('mean')不会像普通groupby().mean()那样返回每个组一行的结果,而是会生成一个和原DataFrame长度完全一致的Series/DataFrame,每个位置的值就是该行所属gameweek组的均值。这样fillna就能精准地把每个NaN替换成它所在组的均值,而不是全局统一的均值。
额外处理:组内全为NaN的情况
如果某个gameweek组里的数值全是NaN,那分组均值也会是NaN,这时候可以再加一层填充,用全局均值兜底:
# 先按组填充,组内全NaN的话用全局均值填充 group_means = df.groupby('gameweek').transform('mean') global_means = df.mean(numeric_only=True) df = df.fillna(group_means).fillna(global_means)
内容的提问来源于stack exchange,提问作者robarthur1
相关产品推荐
相关产品推荐

