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

如何按月份+年份格式对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 03:06:02