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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:28:13