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

如何按年份分组重新排序Pandas DataFrame的列标题?

解决DataFrame列按年份分组排序的问题

问题根源

  • df.sort_values() 无效:这个方法是对数据值排序,而非对列名排序,所以无法调整列的顺序。
  • reindex() 全NaN:你生成的「年份_会议编号」是新列名,但原DataFrame中不存在这些列,reindex 找不到匹配列就会填充NaN,正确做法应该是先重命名列再排序,而非直接用新列名索引。

两种可行解决方案

先构造示例数据方便演示:

import pandas as pd
data = {
    'M1/2022': [1,2,3],
    'M3/2021': [4,5,6],
    'M2/2022': [7,8,9],
    'M1/2021': [10,11,12]
}
df = pd.DataFrame(data)

方案1:不修改列名,直接按年份分组排序列

通过提取列名中的年份和会议编号作为排序依据,生成新的列顺序后重新索引:

# 生成排序后的列顺序:先按年份,同一年按会议编号排序
sorted_cols = sorted(df.columns, key=lambda x: (x.split('/')[1], x.split('/')[0]))
# 重新排列列
df_sorted = df[sorted_cols]

结果列顺序:M1/2021 → M3/2021 → M1/2022 → M2/2022

方案2:修改列名为「年份_会议编号」并排序

先用rename替换列名(保留数据),再对新列名排序:

# 创建列名映射字典
col_mapping = {col: f"{col.split('/')[1]}_{col.split('/')[0]}" for col in df.columns}
# 重命名列(不会丢失数据)
df_renamed = df.rename(columns=col_mapping)
# 对新列名按年份、会议编号排序
sorted_renamed_cols = sorted(df_renamed.columns, key=lambda x: (x.split('_')[0], x.split('_')[1]))
df_renamed_sorted = df_renamed[sorted_renamed_cols]

结果列顺序:2021_M1 → 2021_M3 → 2022_M1 → 2022_M2

简化方案(Pandas 1.4+ 支持)

利用sort_index的key参数直接处理列名:

# 将列名拆分后反转顺序(年份在前,会议编号在后),以此为依据排序
df_sorted = df.sort_index(axis=1, key=lambda x: x.str.split('/').str[::-1])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 18:57:16