如何在GroupBy多索引对象中按月份顺序排序月份统计结果?
解决分组后月份按自然顺序排序的问题
方法一:将月份列转为有序分类(推荐)
value_counts()会遵循分类类型的定义顺序,所以先把month列设置为有序分类,后续分组统计会自动按自然月份顺序输出:
import pandas as pd # 定义自然月份的顺序 month_order = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] # 将month列转换为有序分类类型 df['month'] = pd.Categorical(df['month'], categories=month_order, ordered=True) # 执行分组统计,此时每个年份下的月份已按自然顺序排列 sorted_result = df.groupby(['Year'])['month'].value_counts()
方法二:在统计结果上重新索引(不修改原数据)
如果不想改动原始DataFrame的列类型,可以在分组统计后,通过重新索引调整月份顺序:
month_order = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] # 先执行分组统计,再通过格式转换+重排调整顺序 sorted_result = ( df.groupby(['Year'])['month'].value_counts() .unstack(fill_value=0) # 转为宽表,缺失月份填充0 .reindex(columns=month_order) # 按自定义顺序重排月份列 .stack() # 转回长表格式 .loc[lambda x: x > 0] # 过滤掉无数据的月份(可选,和原value_counts输出一致) )
补充说明
- 方法一的优势是一次设置后,后续所有涉及
month列的排序、统计都会遵循自然顺序,适合需要多次使用该列的场景。 - 方法二无需修改原数据,仅针对统计结果调整顺序,适合临时处理需求。
内容的提问来源于stack exchange,提问作者shaiha razak
相关产品推荐
相关产品推荐

