Pandas:如何按release_year列统计对应最常见的genre值
解决方案
基础实现(仅包含有数据的年份)
假设你的DataFrame名为df,可以通过分组后取众数并调整格式来实现需求:
import pandas as pd # 按年份分组,提取流派的众数(若有多个众数取第一个) result = df.groupby('release_year')['genre'].agg(lambda x: x.mode().iloc[0]).reset_index() # 确保列名与需求一致(如果分组后列名已经正确可省略此步) result.columns = ['release_year', 'genre']
运行后result就会呈现你需要的格式:
release_year genre 0 2020 Horror 1 2021 Crime 2 2023 Action ...
处理特殊情况
- 存在多个众数的年份:如果某一年有多个流派出现次数相同,上述代码会取第一个出现的众数。若需要保留所有众数,可去掉
.iloc[0],此时结果中genre列会是列表格式。 - 包含无数据的年份:如果需要展示连续年份(比如原数据没有2022年但结果要包含),可以先生成完整的年份序列,再合并结果并填充默认值:
# 生成从最小到最大年份的完整序列 min_year = df['release_year'].min() max_year = df['release_year'].max() all_years = pd.DataFrame({'release_year': range(min_year, max_year + 1)}) # 获取有数据年份的流派众数 genre_mode = df.groupby('release_year')['genre'].agg(lambda x: x.mode().iloc[0]).reset_index() # 合并并填充无数据年份的流派(这里默认填充'Crime',可按需修改) result = all_years.merge(genre_mode, on='release_year', how='left').fillna({'genre': 'Crime'})
为什么之前的组合没生效?
直接使用df.groupby('release_year')['genre'].mode()会返回带多级索引的结果,需要通过reset_index()调整结构才能得到你需要的扁平化格式。
内容的提问来源于stack exchange,提问作者NGJon
相关产品推荐
相关产品推荐

