如何在Pandas中筛选Top N城市及投诉类型并绘制Seaborn柱状图
解决方案:筛选Top N城市+每个城市Top M投诉类型并绘制Seaborn柱状图
数据处理步骤
要实现需求,需分阶段完成数据筛选与排序:
- 计算每个城市的总投诉量,筛选出Top N投诉总量最高的城市
- 仅保留这些Top N城市的数据,再计算每个城市内各投诉类型的数量/数值总和
- 对每个城市内的投诉类型按数值降序排序,保留Top M种主要类型
- 给城市按总投诉量降序排序,确保绘图时城市顺序符合要求
完整代码实现
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
相关产品推荐
相关产品推荐

