You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于两列对Pandas DataFrame多列排序的实现方案

解决Pandas按组排序并同步对应列的问题

你的问题核心是需要将成对的列(A.1&A.2、B.1&B.2)作为整体,按每组的第一个元素(A.1、B.1)排序,同时保持每组内两列的对应关系——而df.apply(lambda x: x.sort_values())会对整行所有列单独排序,破坏了这种组内关联,所以达不到预期效果。

下面是两种可行的解决方案,从针对性处理到动态扩展都有覆盖:

方案一:针对固定列的直接处理

如果你的列结构固定(只有A和B两组),可以直接把每组打包成元组,排序后再展开:

  1. 先构造示例数据:
import pandas as pd

df = pd.DataFrame({
    'ii': [1, 2],
    'A.1': ['Xy', 'Ab'],
    'A.2': ['foo', 'bar'],
    'B.1': ['Ly', 'Ko'],
    'B.2': ['bar', 'foo']
})
  1. 定义每行的排序函数:
def sort_row(row):
    # 将A、B两组分别打包成(排序键, 对应值)的元组
    groups = [(row['A.1'], row['A.2']), (row['B.1'], row['B.2'])]
    # 按元组的第一个元素(即A.1/B.1的值)排序
    sorted_groups = sorted(groups, key=lambda x: x[0])
    # 展开排序后的元组,生成新列s1、s2、b1、b2
    return pd.Series(
        [sorted_groups[0][0], sorted_groups[0][1], sorted_groups[1][0], sorted_groups[1][1]],
        index=['s1', 's2', 'b1', 'b2']
    )
  1. 应用函数并合并结果:
# 保留原ii列,合并排序后的结果
sorted_df = pd.concat([df['ii'], df.apply(sort_row, axis=1)], axis=1)

运行后得到的结果就是你想要的:

iis1s2b1b2
1LybarXyfoo
2AbbarKofoo

方案二:支持动态扩展的通用处理

如果后续可能增加更多类似的组(比如C.1&C.2、D.1&D.2),可以用动态方式提取组列,避免硬编码:

# 提取所有以.1结尾的排序键列
key_cols = [col for col in df.columns if col.endswith('.1')]
# 对应提取以.2结尾的值列
value_cols = [col.replace('.1', '.2') for col in key_cols]

def sort_row_dynamic(row):
    # 打包所有组为(键, 值)元组
    groups = list(zip(row[key_cols], row[value_cols]))
    # 按键排序
    sorted_groups = sorted(groups, key=lambda x: x[0])
    # 展开排序后的组,生成新列
    new_values = []
    for group in sorted_groups:
        new_values.extend(group)
    # 自定义新列名(这里沿用你需要的s1、s2、b1、b2,也可以改成更通用的命名)
    new_index = ['s1', 's2', 'b1', 'b2']
    return pd.Series(new_values, index=new_index)

# 生成结果
sorted_df_dynamic = pd.concat([df['ii'], df.apply(sort_row_dynamic, axis=1)], axis=1)

这个方法不管有多少组,都能自动识别并排序,灵活性更强。


内容的提问来源于stack exchange,提问作者Sos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:06:38