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

基于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()

你的代码错误分析

  1. 第一种代码问题:
    你按num_money_complaint和num_food_complaint分组,这会把投诉类型的组合作为X轴,完全颠倒了需求逻辑。正确的分组键应该是city,以城市为维度聚合数据。

  2. 第二种代码问题:

    • nlargest同时指定两个列会导致排序逻辑混乱,无法正确筛选总投诉量前5的城市;
    • 若你希望基于单类投诉排序,只需指定对应列(比如nlargest(5, 'num_money_complaint')),但你的需求是对比两类投诉,所以基于总投诉量排序更合理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 05:48:19