Pandas基于配对列的排序需求:before与after列的特殊排序
搞定自定义配对排序的方案
嘿,针对你给出的Bf/Af列排序需求,我整理了一套清晰的实现思路和代码示例,完全匹配你要的规则:
先明确规则细节
咱们再把规则捋一遍,确保没偏差:
- 每次从还没处理过的Bf值里挑最小的那个,把对应的行放在最前面,并且给这个最小的Bf值标上
* - 紧接着放上它的「反向配对行」——也就是原Af值等于这个最小Bf、原Bf值等于这个最小Bf对应的Af的那一行
- 重复上面的操作,直到所有行都处理完,组与组之间用
-----分隔
用Python实现的具体示例
假设原始数据是列表形式的元组,咱们直接上代码:
# 原始数据,每一项是(Bf, Af) original_data = [(3,5), (0,2), (1,4), (5,3), (2,0), (4,1)] # 用来记录已经处理过的行,避免重复 processed_rows = set() # 存储最终结果 sorted_result = [] # 循环处理直到所有行都被处理 while len(processed_rows) < len(original_data): # 筛选出还没处理的行 unprocessed = [row for row in original_data if row not in processed_rows] # 找到Bf最小的那一行 min_bf_row = min(unprocessed, key=lambda x: x[0]) # 给当前行的Bf加*标记,加入结果 marked_row = (f"{min_bf_row[0]}*", min_bf_row[1]) sorted_result.append(marked_row) processed_rows.add(min_bf_row) # 找到反向配对的行 pair_row = next(row for row in original_data if row[0] == min_bf_row[1] and row[1] == min_bf_row[0]) sorted_result.append(pair_row) processed_rows.add(pair_row) # 如果还有未处理的行,添加分隔线 if len(processed_rows) < len(original_data): sorted_result.append("-----") # 打印输出结果 print("Bf Af") for item in sorted_result: if isinstance(item, tuple): print(f"{item[0]} {item[1]}") else: print(item)
运行这段代码后,输出就和你想要的完全一致:
Bf Af 0* 2 2 0 ----- 1* 4 4 1 ----- 3* 5 5 3
简单拆解下逻辑
- 跟踪已处理行:用集合
processed_rows存已经处理过的行,防止重复操作 - 选最小Bf行:每次从剩余行里挑Bf最小的,这是每组的起点
- 标记+添加:给起点行的Bf加
*,放进结果列表 - 找配对行:通过「Bf和Af互换」的条件找到配对行,也放进结果
- 加分隔线:每组结束后如果还有未处理的行,就加个分隔线区分开
这样就能精准实现你要的排序规则啦~
内容的提问来源于stack exchange,提问作者komodovaran_
相关产品推荐
相关产品推荐

