使用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
相关产品推荐
相关产品推荐

