如何按州总记录数降序排列堆叠柱状图?Pandas排序求助
解决按州总记录数降序排列堆叠柱状图的问题
我明白你的问题啦——你已经按State和Category对DataFrame分组求和,但想让堆叠柱状图里的州按总记录数降序排列,同时保留每个州下三类数据的原有结构,之前尝试的sort_values方法没达到预期效果对吧?
问题根源
你之前的两段代码都没精准匹配需求:
- 第一段
my_df_sort = my_df.groupby(['State','Category']).sum().sort_values(by=['State','Number of Records'])是按州名+单类别记录数排序,不是按州的总记录数排序; - 第二段
my_df_sort2= my_df.groupby(['State']).sum().sort_values(by=['Number of Records'], ascending=False)得到的是仅包含州和总记录数的汇总DataFrame,丢失了Category的分层结构,没法直接生成堆叠柱状图。
解决方案:先定排序顺序,再重排原分组数据
我们可以先提取按总记录数降序的州顺序,再让原分组后的DataFrame遵循这个顺序排列,完美保留原有格式:
步骤1:获取排序后的州顺序
先计算每个州的总记录数,提取降序排列的州名称列表:
import pandas as pd # 计算每个州的总记录数,按降序排序后提取州名 state_sorted_order = my_df.groupby('State')['Number of Records'].sum().sort_values(ascending=False).index
步骤2:重排原分组DataFrame(两种方式可选)
方式1:转为分类类型(适合后续绘图自动识别顺序)
如果你的分组数据已经展开(非多级索引),可以把State列转为Categorical类型并指定顺序:
# 先完成分组求和并展开索引 my_df_grouped = my_df.groupby(['State','Category']).sum().reset_index() # 将State转为分类,指定排序后的顺序 my_df_grouped['State'] = pd.Categorical(my_df_grouped['State'], categories=state_sorted_order, ordered=True) # 绘制堆叠柱状图 my_df_grouped.pivot(index='State', columns='Category', values='Number of Records').plot(kind='bar', stacked=True)
方式2:重排多级索引(适合保留分组后的多级索引结构)
如果想保留['State','Category']的多级索引结构,可以用reindex指定level来重排:
# 完成分组求和(保留多级索引) my_df_grouped = my_df.groupby(['State','Category']).sum() # 按预定义的州顺序重排索引 my_df_grouped_sorted = my_df_grouped.reindex(state_sorted_order, level='State') # 绘制堆叠柱状图(直接用unstack展开类别) my_df_grouped_sorted['Number of Records'].unstack().plot(kind='bar', stacked=True)
这样处理后,你的堆叠柱状图就会按州的总记录数从高到低排列,比如加利福尼亚州(总记录2001)会排在首位,同时每个州下的三类数据结构完全保留。
内容的提问来源于stack exchange,提问作者Ellen-Yilun Wang
相关产品推荐
相关产品推荐

