如何根据另一列中的值将NaN值替换为另一列中的平均值?大熊猫

时间:2020-07-07 12:41:05

标签: python pandas dataframe data-science

我有一个游戏发布和评分的数据框

name,platform,year_of_release,genre,na_sales,eu_sales,jp_sales,other_sales,critic_score,user_score,rating
Wii Sports,Wii,2006.0,Sports,41.36,28.96,3.77,8.45,76.0,8.0,E
Super Mario Bros.,NES,1985.0,Platform,29.08,3.58,6.81,0.77,,,
Mario Kart Wii,Wii,2008.0,Racing,15.68,12.76,3.79,3.29,82.0,8.3,E
Wii Sports Resort,Wii,2009.0,Sports,15.61,10.93,3.28,2.95,80.0,8.0,E
Pokemon Red/Pokemon Blue,GB,1996.0,Role-Playing,11.27,8.89,10.22,1.0,,,

我想用相同类型的平均值填充user_score列中的NaN值。如果游戏具有体育类型,并且该行中的user_score为NaN,我想将空值替换为体育的平均用户评分。

2 个答案:

答案 0 :(得分:1)

此数据已删除了第二个体育游戏的user_score,以便我们可以演示代码。

name,platform,year_of_release,genre,na_sales,eu_sales,jp_sales,other_sales,critic_score,user_score,rating
Wii Sports,Wii,2006.0,Sports,41.36,28.96,3.77,8.45,76.0,8.0,E
Super Mario Bros.,NES,1985.0,Platform,29.08,3.58,6.81,0.77,,,
Mario Kart Wii,Wii,2008.0,Racing,15.68,12.76,3.79,3.29,82.0,8.3,E
Wii Sports Resort,Wii,2009.0,Sports,15.61,10.93,3.28,2.95,80.0,,E
Pokemon Red/Pokemon Blue,GB,1996.0,Role-Playing,11.27,8.89,10.22,1.0,,,

查看Wii体育度假村的用户评分

df.iloc[3]['user_score']

nan

用流派的user_score平均值代替NaN

df['user_score'] = df.groupby('genre')['user_score'].transform(lambda x: x.fillna(x.mean()))

在更新后检查同一游戏的输出

df.iloc[3]['user_score']

8.0

答案 1 :(得分:1)

一种可能的解决方案是创建一个类型平均评级的字典genre_avg,然后根据该字典在user_score中替换NAs

genre_avg = data.groupby(['genre']).agg({'user_score': 'mean'})['user_score'].to_dict()
data['user_score'] = data['user_score'].fillna(data['genre'].map(genre_avg))

在您的小样本数据中,没有任何变化,因为NaNs均没有其他任何平均值。但是,例如,如果您将genre中的Wii SportsSports更改为Platform,则会看到Super Mario Bros.的{​​{1}}已填充平均user_score流派游戏。