如何按年份分组重新排序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
相关产品推荐
相关产品推荐

