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

如何按多列及自定义顺序对Pandas DataFrame进行排序?

解决方法

你遇到的问题是无法通过直接在sort_values中添加condition2实现目标排序,因为目标排序规则并非全局统一:当condition1为'c'时,condition2按升序排列;当condition1为'f'时,condition2需要按降序排列。普通的sort_values无法针对不同分组应用不同排序逻辑,因此需要分组处理或创建辅助列。

方法一:分组后自定义排序

通过groupby按label和condition1分组,对每个子组根据condition1的值指定condition2的排序方向:

import pandas as pd

# 原始数据
df = pd.DataFrame({
        'label': [1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4], 
        'condition1': ['c','c','f','f','c','c','f','f','c','c','f','f','c','c','f','f'], 
        'condition2': ['c','f','c','f','c','f','c','f','c','f','c','f','c','f','c','f']})

# 先按label和condition1排序(你已执行的步骤)
df = df.sort_values(by=['label', 'condition1'], ascending=[True, True])

# 定义分组排序函数
def sort_subgroup(group):
    # 对condition1为'c'的组,condition2升序;为'f'的组,condition2降序
    if group['condition1'].iloc[0] == 'c':
        return group.sort_values('condition2', ascending=True)
    else:
        return group.sort_values('condition2', ascending=False)

# 应用分组排序
df = df.groupby(['label', 'condition1'], group_keys=False).apply(sort_subgroup)

方法二:使用辅助列排序

创建一个辅助列,根据condition1的值转换condition2的内容,让全局排序能间接实现分组内的自定义排序:

import pandas as pd
import numpy as np

# 原始数据及初始排序(同方法一)
df = pd.DataFrame({
        'label': [1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4], 
        'condition1': ['c','c','f','f','c','c','f','f','c','c','f','f','c','c','f','f'], 
        'condition2': ['c','f','c','f','c','f','c','f','c','f','c','f','c','f','c','f']})
df = df.sort_values(by=['label', 'condition1'], ascending=[True, True])

# 创建辅助列:condition1为'f'时,互换condition2的c/f,让排序结果等价于降序
df['sort_key'] = np.where(df['condition1'] == 'c', df['condition2'], df['condition2'].map({'c': 'f', 'f': 'c'}))

# 按label、condition1、辅助列排序,最后删除辅助列
df = df.sort_values(by=['label', 'condition1', 'sort_key']).drop('sort_key', axis=1)

两种方法都能得到你需要的目标DataFrame。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 17:42:40