如何在Pandas中基于自定义值对关联列组按列排序?
问题描述
我有如下结构的DataFrame:
columnA_1, columnB_1, columnC_1, columnA_2, columnB_2, columnC_2, … columnA_n, columnB_n, columnC_n A, 1, DD, D, 1, BV, C, 9, MH B, 1.1, FGH, A, 4, RG, F, 1.1, DW C, 2, CC, A, 2, CC, B, 7, AD D, 2.7, TT, D, 6, JJ, A, 2, LI
其中columnB和columnC与对应的columnA是关联组(比如columnA_1对应columnB_1、columnC_1,columnA_2对应columnB_2、columnC_2以此类推)。我需要根据columnA的值,按照自定义优先级列表对每一行的这些关联组进行排序,同时同步移动对应的columnB和columnC列。
示例中用字母简化说明,实际场景里我有自定义的优先级字符串列表,比如逆字母序的order=['Z','Y','X',...,'A']。最终列名不做要求,示例的预期输出如下:
columnA_1, columnB_1, columnC_1, columnA_2, columnB_2, columnC_2, … columnA_n, columnB_n, columnC_n A, 1, DD, C, 9, MH, D, 1, BV A, 4, RG, B, 1.1, FGH, F, 1.1, DW A, 2, CC, B, 7, AD, C, 2, CC A, 2, LI, D, 6, JJ, D, 2.7, TT
解决方案
核心思路是把每一行的A/B/C关联组拆成独立单元,按自定义优先级排序后再重新拼接回行。
- 构建优先级映射字典
先把自定义优先级列表转换成字典,方便快速获取每个columnA值的排序权重:
order = ['Z','Y','X',...,'A'] # 替换成你的自定义优先级列表 priority = {val: idx for idx, val in enumerate(order)}
- 编写行处理函数
对每一行拆分关联组、排序、再拼接:
import pandas as pd def sort_row(row): # 按3列一组拆分,得到[(A1,B1,C1), (A2,B2,C2), ...]的结构 groups = [row[i:i+3] for i in range(0, len(row), 3)] # 按columnA值的优先级排序,key取字典对应的权重 sorted_groups = sorted(groups, key=lambda x: priority[x[0]]) # 把排序后的组扁平化,返回新行数据 return pd.Series([val for group in sorted_groups for val in group]) # 把函数应用到整个DataFrame的每一行 sorted_df = df.apply(sort_row, axis=1)
- 重置列名(可选)
如果需要保留类似原列名的格式,可以重新设置列名:
num_groups = len(sorted_df.columns) // 3 sorted_df.columns = ( [f'columnA_{i+1}' for i in range(num_groups)] + [f'columnB_{i+1}' for i in range(num_groups)] + [f'columnC_{i+1}' for i in range(num_groups)] )
额外处理(可选)
如果存在columnA的值不在优先级列表中的情况,可添加默认权重把这类组排到最后:
# 给不在列表中的值设置默认优先级(放到最后) default_priority = len(order) sorted_groups = sorted(groups, key=lambda x: priority.get(x[0], default_priority))
内容的提问来源于stack exchange,提问作者VGB
相关产品推荐
相关产品推荐

