我有一个游戏发布和评分的数据框
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,我想将空值替换为体育的平均用户评分。
答案 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 Sports
从Sports
更改为Platform
,则会看到Super Mario Bros.
的{{1}}已填充平均user_score
流派游戏。