使用pandas按指定顺序重排带有序下标的重复行列名DataFrame
解决方案
核心思路是将行/列标签拆分为「类别前缀」和「数字下标」两个维度,先按照自定义的类别优先级排序,同类别再按下标升序排列,最终用排序后的结果重排DataFrame的行和列。
实现代码
import pandas as pd import re # --------------- 原始测试数据构造 --------------- df = pd.DataFrame({0: [11, 3, 10, 9, 6, 9], 1: [12, 4, 11, 8, 5, 8], 2: [13, 5, 12, 7, 4, 7], 3: [14, 6, 13, 6, 3, 6], 4: [15, 7, 14, 5, 2, 5], 5: [16, 8, 15, 4, 1, 4]}) df = df.rename({0:"apple1", 1:"apple2",2:"banana1",3:"banana2",4:"pear1",5:"pear2"}, axis='columns') df = df.rename({0:"apple1", 1:"apple2",2:"banana1",3:"banana2",4:"pear1",5:"pear2"}, axis='index') order = ["banana", "pear", "apple" ] # --------------- 通用排序逻辑 --------------- def get_sort_key(label): # 拆分标签为非数字的类别前缀和数字后缀 prefix, num_part = re.match(r'^(\D+)(\d+)$', label).groups() # 排序规则:先按自定义的类别顺序权重,再按下标数值升序 return (order.index(prefix), int(num_part)) # 分别对列和行执行排序 sorted_columns = sorted(df.columns, key=get_sort_key) sorted_index = sorted(df.index, key=get_sort_key) # 重排得到目标DataFrame df_new = df.loc[sorted_index, sorted_columns]
说明
- 该方法适配所有符合「非数字类别前缀+数字下标」命名规则的行/列标签,同类别下的下标数量不限制
- 只需修改
order列表即可自定义类别优先级,无需调整其他逻辑 - 如果行和列的排序规则不同,单独编写两个排序key函数分别传入行、列的sorted方法即可
- 注意:请确保所有行/列标签的类别前缀都存在于
order列表中,否则会抛出索引错误
内容的提问来源于stack exchange,提问作者David Kim
相关产品推荐
相关产品推荐

