python - 从字典中的值中找到熊猫的平均值?
问题描述
在一个包含大量电影数据集的项目上进行实验。我有一个大数据框,其中一行名为“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
解决方案
编辑:
现在,当我看到所有信息时,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)
推荐阅读
- python - Python - 如何以编程方式添加属性访问器
- python - 在python中有条件地更改类实例属性
- sql - 在 postgresql 中删除重复的行
- javascript - 在单击时重新插入的元素上使用Parents()
- javascript - 聊天系统的滚动条一直自动向下滚动
- reactjs - 如何使用 Context 传递 useReducer 状态?- 反应原生
- java - 有没有办法设置下拉高度的限制?或者甚至对下拉列表中显示的项目设置限制?
- perl - 在 Template Toolkit 中按值而不是键对哈希引用进行排序
- c++ - 在应用程序终止时关闭 COM 端口
- kubernetes - 有没有像 Istio 这样支持 LXC 容器的服务网格实现?