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

Python Pandas分组排序问题:按Type、I/P优先级降序排列Value

背景

现有如下格式的表格:

文件(File)IDRIDC类型(Type)I/P数值(Value)
11ID1PrimaryP5
11ID2SecondaryP6
11ID3PrimaryI7
22ID4PrimaryI8
22ID5SecondaryP10

每个【File】对应独立的IDR,每个【IDR】包含带有Type(Primary/Secondary)和Value的IDC。

问题描述

需对【Value】进行降序排序,但需优先保留Primary类型,其次为Secondary类型;同时需兼顾I/P的区分,且File和IDR为核心分组列。

最初尝试对数值排序:

df3 = df2.groupby(['filename', 'ID_R']).apply(lambda x: x.sort_values(by=['Type', 'Value'], ascending=[True, False]))

后续尝试结合I/P进行混合排序:

.assign(seq=df.groupby(['Type', 'I/P']).cumcount()).sort_values(['Type', 'seq', 'I/P']).drop(columns='seq')

但此方式会忽略最初的groupby(['filename', 'ID_R'])分组逻辑。

期望输出
文件(File)IDRIDC类型(Type)I/P数值(Value)
11ID3PrimaryI7
11ID1PrimaryP5
11ID2SecondaryP6
22ID4PrimaryI8
22ID5SecondaryP10
解决方案

要实现需求,需在每个文件(File)和IDR分组内,按以下优先级排序:

  1. 优先排列Type为Primary的行,再排Secondary
  2. 同一Type内,先排I/P为I的行,再排P的行
  3. 同一Type和I/P的分组内,按Value降序排列

对应代码实现如下:

df_sorted = df.groupby(['文件(File)', 'IDR'], group_keys=False).apply(
    lambda x: x.sort_values(
        by=['类型(Type)', 'I/P', '数值(Value)'],
        ascending=[True, False, False]
    )
).reset_index(drop=True)

代码说明

  • groupby(['文件(File)', 'IDR'], group_keys=False):按核心分组列进行分组,group_keys=False避免生成额外分组键列
  • sort_values排序规则:
    • 类型(Type)升序:利用字典序特性,让Primary排在Secondary之前
    • I/P降序:让I排在P之前,满足I/P区分要求
    • 数值(Value)降序:实现数值从大到小排列

运行上述代码后,即可得到符合期望的输出结果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:20:31