如何按月份+年份格式对Pandas DataFrame进行自定义排序
问题解决思路与代码实现
你完全不需要按年份拆分再合并,直接通过有序分类或者日期类型排序即可,两种实现方式如下:
方法1:基于有序分类多列排序
和你原有思路最接近的优化版本,逻辑直观易理解:
import pandas as pd # 定义月份优先级顺序 sort_order = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'] # 直接把month列转为有序分类,无需修改索引 df['month'] = pd.Categorical(df['month'], categories=sort_order, ordered=True) # 按年份、月份先后排序,ignore_index参数直接重置行号,无需额外调用reset_index df = df.sort_values(by=['year', 'month'], ignore_index=True)
方法2:基于日期类型自动排序(更省事,无需自定义月份顺序)
直接把ym列转为pandas日期类型,会自动识别英文月份缩写,不需要手动维护月份顺序:
# 把ym列转为日期类型,%b对应英文月份缩写,%Y对应4位年份 df['ym_dt'] = pd.to_datetime(df['ym'], format='%b %Y') # 按日期列排序 df = df.sort_values(by='ym_dt', ignore_index=True) # 排序完成后可以删掉临时的日期辅助列 df = df.drop(columns='ym_dt')
原有操作的问题解答
- 如果你确实需要用groupby按年份拆分,写法如下,但排序场景完全不需要这么做:
# 按year分组后提取每个分组的df,存储为列表 year_dfs = [group for _, group in df.groupby('year')]
- 排序临时生效的原因是
df.sort_index()默认返回新的DataFrame对象,不会修改原df,你要么把结果赋值给变量(比如df = df.sort_index().reset_index(drop=True)),要么加inplace=True参数,更推荐赋值的写法,避免inplace带来的隐性修改问题。 - 只要你把排序后的结果赋值给变量保存,不管后续是合并还是其他操作,都不会回到原始顺序,无需担心。
内容的提问来源于stack exchange,提问作者resssslll
相关产品推荐
相关产品推荐

