基于DataFrame绘制多列柱状图:Top5城市投诉类型求和对比
解决方案:绘制前5城市两类投诉总和的分组柱状图
步骤说明
要实现你的需求,需先按城市聚合两类投诉数据,再基于总投诉量筛选前5城市,最后绘制分组柱状图。以下是完整代码和错误分析:
完整代码
import pandas as pd import matplotlib.pyplot as plt # 构建示例数据(可替换为你的真实数据) data = { 'ID coustumer': [0,1,2,3,4,5,6,7], 'city': ['city0','city1','city0','city2','city2','city2','city3','city4'], 'num_money_complaint': [0,2,4,1,2,0,3,3], 'num_food_complaint': [2,1,1,1,3,1,4,1] } df = pd.DataFrame(data) # 1. 按城市分组,计算两类投诉的总和 city_complaints = df.groupby('city')[['num_money_complaint', 'num_food_complaint']].sum() # 2. 计算总投诉量并筛选前5城市 city_complaints['total'] = city_complaints.sum(axis=1) top5_cities = city_complaints.nlargest(5, 'total').drop('total', axis=1) # 3. 绘制分组柱状图 top5_cities.plot(kind='bar', figsize=(10,6), width=0.7) plt.title('Top 5 Cities: Money vs Food Complaints') plt.xlabel('City') plt.ylabel('Total Complaints') plt.legend(title='Complaint Category') plt.xticks(rotation=0) plt.tight_layout() plt.show()
你的代码错误分析
第一种代码问题:
你按num_money_complaint和num_food_complaint分组,这会把投诉类型的组合作为X轴,完全颠倒了需求逻辑。正确的分组键应该是city,以城市为维度聚合数据。第二种代码问题:
nlargest同时指定两个列会导致排序逻辑混乱,无法正确筛选总投诉量前5的城市;- 若你希望基于单类投诉排序,只需指定对应列(比如
nlargest(5, 'num_money_complaint')),但你的需求是对比两类投诉,所以基于总投诉量排序更合理。
内容的提问来源于stack exchange,提问作者user19706373
相关产品推荐
相关产品推荐

