如何通过Pandas的groupby获取每年出现最多的电影类型?
问题描述
我有一个电影DataFrame,想要按年份分组,获取每年出现次数最多的电影类型:
import pandas as pd data = {'year' : [2000,2000,2001,2001, 2001,2001,2002,2002,2002,2002], 'movie': ['movie1','movie2', 'movie3', 'movie4', 'movie5', 'movie6', 'movie7', 'movie8', 'movie9', 'movie10'], 'genre': ['action', 'action', 'comedy', 'drama','comedy', 'horror', 'sci-fi','horror', 'horror', 'action']} movie = pd.DataFrame(data)
期望输出:
2000 : action 2001 : comedy 2002 : horror
我尝试了以下代码:
movie.groupby(["year", "genre"])['genre'].value_counts().max(level = 0)
但只得到了各年份的最高出现次数:
2 2 3
需要调整代码以得到期望的类型结果。
解决方案1:分组后用value_counts+idxmax
先按年份分组,对每个组的genre列统计频次,再取频次最高值对应的索引(即电影类型):
result = movie.groupby('year')['genre'].apply(lambda x: x.value_counts().idxmax()) print(result)
输出结果:
year 2000 action 2001 comedy 2002 horror Name: genre, dtype: object
如果要转换成题目期望的字符串格式,可循环输出:
for year, genre in result.items(): print(f"{year} : {genre}")
解决方案2:使用mode方法
mode方法直接返回每组的众数(出现次数最多的元素),更简洁:
result = movie.groupby('year')['genre'].agg(pd.Series.mode) print(result)
输出与方案1一致,同样可通过循环转换成目标格式。
解决方案3:pivot_table统计频次后取最大值对应类型
先构建年份-类型的频次统计表,再按年份筛选频次最高的类型:
# 构建频次表,填充缺失值为0 count_table = movie.pivot_table(index='year', columns='genre', aggfunc='size', fill_value=0) # 取每行最大值对应的列名(即电影类型) result = count_table.idxmax(axis=1) print(result)
输出同样符合要求。
内容的提问来源于stack exchange,提问作者luca kramp
相关产品推荐
相关产品推荐

