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

使用fillna按班级均值填充DataFrame中NaN值失效问题求助

问题原因

你直接用fillna(average_mark)无法填充NaN的核心原因是:

  • average_mark是分组后得到的Series,它的索引是stud_class的取值('1st'、'2nd')
  • 原DataFrame的索引是默认的0-4,两者索引不匹配,pandas无法将对应班级的平均分映射到对应的行,所以NaN值保留。
解决方案

有两种简单有效的解决方式:

方法1:使用transform方法(推荐)

transform会对每个分组执行计算,并返回与原DataFrame长度一致的结果,直接完成填充:

import pandas as pd
import numpy as np

data = ({'stud_id': [1, 2, 3, 4, 5], 
         'stud_class': ['1st', '1st', '1st', '2nd', '2nd'],
         'stud_mark': [100, np.nan, 90, np.nan, 80]})
df = pd.DataFrame(data) 

# 按班级分组,用组内均值填充NaN
df['stud_mark'] = df.groupby('stud_class')['stud_mark'].transform(
    lambda x: x.fillna(x.mean())
)

print(df)

执行后输出:

stud_id stud_class  stud_mark
0        1        1st      100.0
1        2        1st       95.0
2        3        1st       90.0
3        4        2nd       80.0
4        5        2nd       80.0

方法2:使用map映射班级平均分

先计算班级平均分,再通过map将每个班级对应到平均分,最后填充NaN:

import pandas as pd
import numpy as np

data = ({'stud_id': [1, 2, 3, 4, 5], 
         'stud_class': ['1st', '1st', '1st', '2nd', '2nd'],
         'stud_mark': [100, np.nan, 90, np.nan, 80]})
df = pd.DataFrame(data) 

# 计算班级平均分
average_mark = df.groupby('stud_class')['stud_mark'].mean()

# 通过map获取每行对应的班级平均分,再填充NaN
df['stud_mark'] = df['stud_mark'].fillna(df['stud_class'].map(average_mark))

print(df)

执行后输出和方法1一致。

内容的提问来源于stack exchange,提问作者Sandeep Mohanty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 12:55:07