分组场景下如何筛选指定列最大值并实现结果可视化

实现步骤
整个实现分两步:先提取每个学期分组下票房最高的电影记录,再基于结果做可视化,以下是基于Python数据处理常用栈(pandas + matplotlib/seaborn)的实现代码:
1. 提取各学期最高票房电影记录
两种实现方式按需选择即可:
- 方式1:用
groupby搭配idxmax,直接取每个分组票房最大值对应的原始行,逻辑最简洁
import pandas as pd # 替换成你自己的数据集变量名、列名即可 # movie_df 是你的原始电影数据集 # semester 是存储学期维度的列名 # revenue 是存储票房数值的列名 # title 是存储电影名称的列名 max_revenue_index = movie_df.groupby('semester')['revenue'].idxmax() top_movie_each_sem = movie_df.loc[max_revenue_index].sort_values('semester').reset_index(drop=True)
- 方式2:先排序再去重,适合需要处理同分组同最高票房多记录的场景,会保留排序后第一条最高票房记录
top_movie_each_sem = movie_df.sort_values( by=['semester', 'revenue'], ascending=[True, False] # 学期升序、同个学期内票房降序 ).drop_duplicates(subset='semester', keep='first').reset_index(drop=True)
可以通过打印核心字段校验结果是否符合预期:
print(top_movie_each_sem[['semester', 'title', 'revenue']])
注意:如果输出结果里学期的排序不符合时间先后逻辑,可以先把学期列转成pandas有序分类类型,指定你需要的顺序即可:
# 替换成你自己数据集里的学期值顺序 semester_rank = ['2019春', '2019秋', '2020春', '2020秋', '2021春'] movie_df['semester'] = pd.Categorical(movie_df['semester'], categories=semester_rank, ordered=True)
2. 结果可视化
最直观的呈现方式是横向条形图,每个学期对应一条最高票房记录,直接标注电影名和票房数值:
import matplotlib.pyplot as plt import seaborn as sns # 画布基础配置 plt.figure(figsize=(12, 7)) sns.set_style("whitegrid") # 绘制横向条形图,避免长电影名重叠 chart = sns.barplot( data=top_movie_each_sem, x='revenue', y='semester', palette='mako' ) # 为每个条形添加标注:显示电影名+换算单位后的票房 for idx, row in top_movie_each_sem.iterrows(): chart.text( x=row['revenue'] * 1.01, y=idx, s=f"{row['title']} | {round(row['revenue']/1e8, 2)}亿", va='center' ) # 设置图表标签 plt.title('各学期最高票房电影统计', fontsize=15, pad=20) plt.xlabel('票房(单位:元)', fontsize=12) plt.ylabel('学期', fontsize=12) plt.tight_layout() plt.show()
运行后就能得到每个学期对应最高票房电影的条形图,数值和电影名对应清晰,可根据自己的展示需求调整配色、单位换算规则。
内容的提问来源于stack exchange,提问作者Gina Orellana C
相关产品推荐
相关产品推荐

