如何基于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
相关产品推荐
相关产品推荐

