使用Pandas按前缀及季度规则排序DataFrame列名并保留ID列首位
解决DataFrame按前缀分组并按季度排序列的问题
问题场景
你有一个包含100+列的大型DataFrame,迷你示例如下:
ID rev_Q1 rev_Q5 rev_Q4 rev_Q3 rev_Q2 tx_Q3 tx_Q5 tx_Q2 tx_Q1 tx_Q4 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1
需求
- 对每个前缀(下划线前的关键词,如
rev、tx)下的列按季度(Q1、Q2…Qn)排序 - 保持
ID列在首位
你尝试过df = df.reindex(sorted(df.columns), axis=1),但该方法无效,还将ID列移到了末尾。期望输出如下:
ID rev_Q1 rev_Q2 rev_Q3 rev_Q4 rev_Q5 tx_Q1 tx_Q2 tx_Q3 tx_Q4 tx_Q5 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1
实际场景中有30+类似rev、tx的前缀。
解决方案
核心思路是:单独保留ID列,对剩余列按前缀+季度数字的规则排序,避免默认字符串排序的逻辑问题。
直接运行以下代码即可实现需求:
import pandas as pd # (如果已有DataFrame可跳过这步,直接处理你的df) data = { 'ID': [1, 2], 'rev_Q1': [1, 1], 'rev_Q5': [1, 1], 'rev_Q4': [1, 1], 'rev_Q3': [1, 1], 'rev_Q2': [1, 1], 'tx_Q3': [1, 1], 'tx_Q5': [1, 1], 'tx_Q2': [1, 1], 'tx_Q1': [1, 1], 'tx_Q4': [1, 1] } df = pd.DataFrame(data) # 定义排序键:拆分列名,按前缀+季度数字排序 def sort_col(col): prefix, quarter = col.split('_') # 提取Q后面的数字,转为整数用于排序 q_num = int(quarter.strip('Q')) return (prefix, q_num) # 拆分ID列和其他列,避免ID被排序 id_col = ['ID'] sorted_cols = id_col + sorted(df.columns.drop('ID'), key=sort_col) # 重新排列DataFrame的列 df = df[sorted_cols] # 查看结果 print(df)
说明
sort_col函数将列名拆分为前缀(如rev)和季度部分(如Q5),提取季度数字转为整数后排序,确保同一前缀下的列按Q1→Q2→…→Qn的顺序排列- 单独处理ID列,保证它始终在首位
- 该方法自动适配所有前缀,无需手动指定30+个前缀,适合大型DataFrame场景
内容的提问来源于stack exchange,提问作者The Great
相关产品推荐
相关产品推荐

