首页 > 解决方案 > 从字典中的值中找到熊猫的平均值?

问题描述

在一个包含大量电影数据集的项目上进行实验。我有一个大数据框,其中一行名为“Genres”,另一行名为“Vote Average”。我的目标是根据“平均投票”找到评分最高的 20 个类型。

我会使用 group by 但我似乎无法弄清楚,因为流派信息在“流派”列中如下所示:

[{'id': 35, 'name': 'Comedy'}, {'id': 18, 'name': 'Drama'}, {'id': 10749, 'name': 'Romance'}]

如何从上面的列表中提取喜剧、戏剧和浪漫?如何在为每个流派分配“平均投票”行时按单个流派分组,以便我可以打印数据框中排名前 20 的流派?

     Genres  Vote Average
1      [{'id': 16, 'name': 'Animation'}, {'id': 35, '...           7.7
2      [{'id': 12, 'name': 'Adventure'}, {'id': 14, '...           6.9
3      [{'id': 10749, 'name': 'Romance'}, {'id': 35, ...           6.5
4      [{'id': 35, 'name': 'Comedy'}, {'id': 18, 'nam...           6.1
5                         [{'id': 35, 'name': 'Comedy'}]           5.7
...                                                  ...           ...
32255           [{'id': 878, 'name': 'Science Fiction'}]           3.5
32256  [{'id': 18, 'name': 'Drama'}, {'id': 28, 'name...           5.7
32257  [{'id': 28, 'name': 'Action'}, {'id': 18, 'nam...           3.8
32258                                                 []           0.0
32259                                                 []           0.0

编辑:来自数据框的示例在上面。来自https://www.kaggle.com/rounakbanik/the-movies-dataset的 movies_metadata.csv

标签: pythonpandasdataframegroup-bypandas-groupby

解决方案


编辑:

现在,当我看到所有信息时,kaggle我认为它可能需要完全不同的方法,因为这些流派被分配给标题并且它们不能位于单独的行中。


老的:

现在,您必须将其转换为正确DataFrame的类型,其中包含分隔行中的流派

[{'id': 35, 'name': 'Comedy'}, {'id': 18, 'name': 'Drama'}, ...]

这是我的示例数据

import pandas as pd

df = pd.DataFrame([
    {'Genre': [{'id': 16, 'name': 'Animation'}], 'Vote Average': 7.7},
    {'Genre': [{'id': 35, 'name': 'Comedy'}, {'id': 18, 'name': 'Drama'}, {'id': 10749, 'name': 'Romance'}], 'Vote Average': 6.1},
    {'Genre': [{'id': 10749, 'name': 'Romance'}], 'Vote Average': 6.5},
])

print(df)

结果:

                                               Genre  Vote Average
0                  [{'id': 16, 'name': 'Animation'}]           7.7
1  [{'id': 35, 'name': 'Comedy'}, {'id': 18, 'nam...           6.1
2                 [{'id': 10749, 'name': 'Romance'}]           6.5

您可以迭代每一行并使用pd.DataFrame(row['Genre'])创建正确的数据框,您将添加到新的全局数据框

new_df = pd.DataFrame(columns=['id', 'name', 'Vote Average'])

for index, row in df.iterrows():
    temp_df = pd.DataFrame(row['Genre'])
    temp_df['Vote Average'] = row['Vote Average']
    new_df = new_df.append(temp_df)
    
print(new_df)    

结果:

      id       name  Vote Average
0     16  Animation           7.7
0     35     Comedy           6.1
1     18      Drama           6.1
2  10749    Romance           6.1
0  10749    Romance           6.5

现在你可以做任何你喜欢的事了。


更正数据的其他方法:

首先将字典列表转换为带有字典的分隔行

new_df = df.explode('Genre')
print(new_df) 

结果:

                          Genre  Vote Average
0   {'id': 16, 'name': 'Animation'}           7.7
1      {'id': 35, 'name': 'Comedy'}           6.1
1       {'id': 18, 'name': 'Drama'}           6.1
1  {'id': 10749, 'name': 'Romance'}           6.1
2  {'id': 10749, 'name': 'Romance'}           6.5

然后将每个字典转换为列

new_df['id'] = new_df['Genre'].str['id']
new_df['name'] = new_df['Genre'].str['name']
print(new_df)

结果:

                              Genre  Vote Average     id       name
0   {'id': 16, 'name': 'Animation'}           7.7     16  Animation
1      {'id': 35, 'name': 'Comedy'}           6.1     35     Comedy
1       {'id': 18, 'name': 'Drama'}           6.1     18      Drama
1  {'id': 10749, 'name': 'Romance'}           6.1  10749    Romance
2  {'id': 10749, 'name': 'Romance'}           6.5  10749    Romance

或使用

new_df[['id','name']] = new_df['Genre'].apply(pd.Series)

完整示例

import pandas as pd

df = pd.DataFrame([
    {'Genre': [{'id': 16, 'name': 'Animation'}], 'Vote Average': 7.7},
    {'Genre': [{'id': 35, 'name': 'Comedy'}, {'id': 18, 'name': 'Drama'}, {'id': 10749, 'name': 'Romance'}], 'Vote Average': 6.1},
    {'Genre': [{'id': 10749, 'name': 'Romance'}], 'Vote Average': 6.5},
])

print('--- df ---')
print(df)

print('--- iterrows ---')

new_df = pd.DataFrame(columns=['id', 'name', 'Vote Average'])
for index, row in df.iterrows():
    temp_df = pd.DataFrame(row['Genre'])
    temp_df['Vote Average'] = row['Vote Average']
    new_df = new_df.append(temp_df)
    
print(new_df)    

print('--- explode #1 ---')
new_df = df.explode('Genre')
print(new_df)    

print('--- columns #1 ---')
new_df['id'] = new_df['Genre'].str['id']
new_df['name'] = new_df['Genre'].str['name']
new_df.drop('Genre', inplace=True, axis=1)
new_df.reset_index(inplace=True)
print(new_df)

print('--- explode #2 ---')
new_df = df.explode('Genre')
print(new_df)    

print('--- columns #2 ---')
new_df[['id','name']] = new_df['Genre'].apply(pd.Series)
new_df.drop('Genre', inplace=True, axis=1)
new_df.reset_index(inplace=True)
print(new_df)

推荐阅读