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

如何在Pandas中筛选Top N城市及投诉类型并绘制Seaborn柱状图

解决方案:筛选Top N城市+每个城市Top M投诉类型并绘制Seaborn柱状图

数据处理步骤

要实现需求,需分阶段完成数据筛选与排序:

  1. 计算每个城市的总投诉量,筛选出Top N投诉总量最高的城市
  2. 仅保留这些Top N城市的数据,再计算每个城市内各投诉类型的数量/数值总和
  3. 对每个城市内的投诉类型按数值降序排序,保留Top M种主要类型
  4. 给城市按总投诉量降序排序,确保绘图时城市顺序符合要求

完整代码实现

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 自定义参数:可根据需求修改
TOP_N_CITIES = 5  # 取投诉总量Top5的城市
TOP_M_COMPLAINTS = 3  # 每个城市保留Top3投诉类型

# 1. 计算每个城市的总投诉量,筛选Top N城市
# 若你的Value列是投诉数值(如次数/严重程度),将size()替换为sum('Value')
city_total = df.groupby('City').size().reset_index(name='total_complaints')
top_n_cities = city_total.sort_values('total_complaints', ascending=False).head(TOP_N_CITIES)['City'].tolist()

# 2. 过滤原数据,仅保留Top N城市
filtered_df = df[df['City'].isin(top_n_cities)]

# 3. 计算每个城市各投诉类型的数量/数值总和
complaint_stats = filtered_df.groupby(['City', 'Complaint Type']).size().reset_index(name='count')
# 若用Value列总和:complaint_stats = filtered_df.groupby(['City', 'Complaint Type'])['Value'].sum().reset_index(name='total_value')

# 4. 筛选每个城市的Top M投诉类型,并按总投诉量排序城市
top_m_data = complaint_stats.sort_values(['City', 'count'], ascending=[True, False])\
                            .groupby('City').head(TOP_M_COMPLAINTS)
# 合并总投诉量数据,用于后续排序
top_m_data = top_m_data.merge(city_total, on='City')
# 按城市总投诉量降序、组内投诉量降序排序
top_m_data = top_m_data.sort_values(['total_complaints', 'count'], ascending=[False, False])
# 将City设为分类类型,锁定绘图顺序(避免自动排序)
top_m_data['City'] = pd.Categorical(top_m_data['City'], categories=top_n_cities, ordered=True)

# 5. 绘制Seaborn柱状图
plt.figure(figsize=(12, 6))
# 若用total_value替换count:y='total_value'
sns.barplot(data=top_m_data, x='City', y='count', hue='Complaint Type', order=top_n_cities)
plt.title(f'Top {TOP_N_CITIES} Cities by Total Complaints (Top {TOP_M_COMPLAINTS} Complaint Types)')
plt.xlabel('City')
plt.ylabel('Number of Complaints')
# 将图例移到图外,避免遮挡
plt.legend(title='Complaint Type', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.tight_layout()
plt.show()

关键说明

  • 若你的Value列是投诉的数值(而非每条记录对应一个投诉),只需把代码中所有的size()替换为sum('Value'),并将count字段改为total_value即可适配。
  • 通过将City设为有序分类类型,确保绘图时城市始终按总投诉量降序排列,不会丢失分组排序状态。
  • 原代码的问题在于未先筛选Top N城市,也未基于城市总投诉量做全局排序,导致最终数据顺序不符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 02:30:54