Python获取多列的值计数和另一列的平均值

3

我有一个包含以下列的数据框:

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()
2个回答

4
你可以使用 .melt 函数将数据框转换为融合表,然后在融合表上按照类型 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

0

将类型编码为其值计数的过程称为频率编码,可以使用以下代码完成

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接