问题描述
Movie rating Genre_0 Genre_1 Genre_2
MovieA 8.9 Action Comedy Family
MovieB 9.1 Horror NaN NaN
MovieC 4.4 Comedy Family Adventure
MovieD 7.7 Action Adventure NaN
MovieE 9.5 Adventure Comedy NaN
MovieF 7.5 Horror NaN NaN
MovieG 8.6 Horror NaN NaN
我想要一个数据框,其中包含每种类型的价值计数以及每次出现该类型时的平均评分
Genre value_count Average_rating
Action 2 8.3
Comedy 3 7.6
Horror 3 8.4
Family 2 6.7
Adventure 3 7.2
我尝试了以下代码并且能够获得值计数。但是,我无法根据每种类型出现的次数获得每种类型的平均评分。非常感谢任何形式的帮助,谢谢。
#create a list for the genre columns
genre_col = [col for col in df if col.startswith('Genre_')]
#get value counts of genres
genre_counts = df[genre_col].apply(pd.Series.value_counts).sum(1).to_frame(name='Count')
genre_counts.index.name = 'Genre'
genre_counts = genre_counts.reset_index()
解决方法
您可以先 .melt
数据框,然后 group
然后在 genre
上融合框架,并使用指定列及其相应聚合函数的字典进行聚合:
# filter and melt the dataframe
m = df.filter(regex=r'Rating|Genre').melt('Rating',value_name='Genre')
# group and aggregate
dct = {'Value_Count': ('Genre','count'),'Average_Rating': ('Rating','mean')}
df_out = m.groupby('Genre',as_index=False).agg(**dct)
>>> df_out
Genre Value_Count Average_Rating
0 Action 2 8.30
1 Adventure 3 7.20
2 Comedy 3 7.60
3 Family 2 6.65
4 Horror 3 8.40
,
将流派编码到它们的值计数的过程是频率编码,它可以用这个代码完成
df_frequency_map = df.Genre_0.value_counts().to_dict()
df['Genre0_frequency_map'] = df.Genre_0.map(df_frequency_map)
将平均值作为特征添加到数据集中我认为您可以执行相同的操作,但在执行 to_dict()
函数之前计算平均值。
df_frequency_map = df.df.Genre_0.value_counts().mean().to_dict()
df['Genre0_mean_frequency_map'] = df.Genre_0.map(df_frequency_map)