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
相关产品推荐
相关产品推荐

