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

如何基于YearMonth列整数末三位重排Pandas DataFrame行?

解决DataFrame按月份分组、年份排序的需求

嗨,这个排序需求很明确,我们要让同一月份(YearMonth的末三位)的行按年份(前四位)排序后相邻排列,下面给你两种实用的实现方案:

方法1:直接使用sort_values的key参数(简洁版)

这种方法不需要创建额外列,直接通过lambda函数提取排序键,代码更简洁:

import pandas as pd

# 构建你的原始DataFrame
df = pd.DataFrame({
    'YearMonth': [2015009, 2015010, 2015011, 2015012, 2016008, 2016009, 2016010, 2016011, 2016012],
    'Total Cost': ['$11,209,041', '$20,581,043', '$37,079,415', '$36,831,335', '$57,428,630', '$66,754,405', '$45,021,707', '$34,783,970', '$66,215,044']
})

# 按「月份(末三位)→ 年份(前四位)」的顺序排序
df_sorted = df.sort_values(
    by='YearMonth',
    key=lambda x: (x % 1000, x // 1000)
)

print(df_sorted)

代码解释

  • x % 1000:提取YearMonth的末三位,得到月份(比如2015009→9)
  • x // 1000:提取YearMonth的前四位,得到年份(比如2015009→2015)
  • 排序时先按月份升序,再按年份升序,这样同月份的行就会按年份顺序相邻排列

方法2:创建辅助列(直观版)

如果觉得lambda函数不够直观,可以先创建年份和月份的辅助列,排序后再删除,逻辑更清晰:

import pandas as pd

# 原始DataFrame
df = pd.DataFrame({
    'YearMonth': [2015009, 2015010, 2015011, 2015012, 2016008, 2016009, 2016010, 2016011, 2016012],
    'Total Cost': ['$11,209,041', '$20,581,043', '$37,079,415', '$36,831,335', '$57,428,630', '$66,754,405', '$45,021,707', '$34,783,970', '$66,215,044']
})

# 添加年份和月份辅助列
df['Month'] = df['YearMonth'] % 1000
df['Year'] = df['YearMonth'] // 1000

# 按月份、年份排序后删除辅助列
df_sorted = df.sort_values(by=['Month', 'Year']).drop(['Month', 'Year'], axis=1)

print(df_sorted)

最终期望输出

两种方法都会得到如下排序结果:

YearMonth   Total Cost
4    2016008  $57,428,630
0    2015009  $11,209,041
5    2016009  $66,754,405
1    2015010  $20,581,043
6    2016010  $45,021,707
2    2015011  $37,079,415
7    2016011  $34,783,970
3    2015012  $36,831,335
8    2016012  $66,215,044

内容的提问来源于stack exchange,提问作者PineNuts0

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:02:47