Python Pandas分组排序问题:按Type、I/P优先级降序排列Value
背景
现有如下格式的表格:
| 文件(File) | IDR | IDC | 类型(Type) | I/P | 数值(Value) |
|---|---|---|---|---|---|
| 1 | 1 | ID1 | Primary | P | 5 |
| 1 | 1 | ID2 | Secondary | P | 6 |
| 1 | 1 | ID3 | Primary | I | 7 |
| 2 | 2 | ID4 | Primary | I | 8 |
| 2 | 2 | ID5 | Secondary | P | 10 |
每个【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) | IDR | IDC | 类型(Type) | I/P | 数值(Value) |
|---|---|---|---|---|---|
| 1 | 1 | ID3 | Primary | I | 7 |
| 1 | 1 | ID1 | Primary | P | 5 |
| 1 | 1 | ID2 | Secondary | P | 6 |
| 2 | 2 | ID4 | Primary | I | 8 |
| 2 | 2 | ID5 | Secondary | P | 10 |
解决方案
要实现需求,需在每个文件(File)和IDR分组内,按以下优先级排序:
- 优先排列
Type为Primary的行,再排Secondary - 同一
Type内,先排I/P为I的行,再排P的行 - 同一
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
相关产品推荐
相关产品推荐

