You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

matplotlib中两列group by后绘制城市及对应银行存款柱状图的实现方法

实现思路
  • 先统计所有城市的总存款,筛选出总存款排名前5的城市名单
  • 保留城市-银行分组求和结果中属于前5城市的所有数据
  • 对每个城市内的银行按存款额降序排序,取每个城市存款最高的3家银行数据
  • 绘制分组柱状图,X轴展示城市名称,每个城市对应3个条形分别展示对应银行存款额
代码实现
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# --------------- 数据预处理 ---------------
# 1. 先按城市+银行分组求和
grp_city_bank = df.groupby(['CITY','BANK'])['DEPOSIT'].sum().reset_index()

# 2. 计算每个城市总存款,取前5的城市
city_total = grp_city_bank.groupby('CITY')['DEPOSIT'].sum().reset_index(name='CITY_TOTAL')
top5_cities = city_total.sort_values('CITY_TOTAL', ascending=False).head(5)['CITY'].tolist()

# 3. 仅保留前5城市的数据,再取每个城市存款前3的银行
top_data = grp_city_bank[grp_city_bank['CITY'].isin(top5_cities)]
top_data = top_data.groupby('CITY', group_keys=False).apply(lambda x: x.sort_values('DEPOSIT', ascending=False).head(3)).reset_index(drop=True)

# --------------- 绘图部分 ---------------
plt.figure(figsize=(12,6))
# 用seaborn的分组柱状图,hue参数区分银行
sns.barplot(data=top_data, x='CITY', y='DEPOSIT', hue='BANK', palette='viridis')

# 图表样式调整
plt.xlabel('城市')
plt.ylabel('存款额')
plt.title('Top5城市各Top3银行存款额')
plt.legend(title='银行名称')
plt.show()
代码说明
  • 预处理部分用到的group_keys=False避免生成多余的分组索引,apply内对每个城市的子集排序后取前3条,正好满足每个城市留3家银行的需求
  • 绘图用hue参数按银行区分颜色,自动生成分组柱状图,X轴仅展示城市名称,每个城市下的柱子数量和对应银行匹配,符合要求
  • 如果样本中部分城市银行数量不足3家,会自动保留该城市所有银行的柱子,不会报错

内容的提问来源于stack exchange,提问作者Anon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 02:57:02