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

如何实现Pandas DataFrame的条件部分排序:按小时费率排序且将带编号超级英雄置于末尾

简洁的Pythonic解决方案

要实现你的需求——先将不含(Nr X)格式的超级英雄按hourly rate降序排列,再将含编号的超级英雄同样按hourly rate降序排列并放在末尾——不需要拆分合并DataFrame,用sort_values的key参数就能一步搞定。

核心思路

我们可以生成一个复合排序键,这个键包含两个维度:

  1. 标记当前英雄名称是否包含编号(True表示有编号,False表示无),排序时让False排在前面(无编号组在前)
  2. 取hourly rate的负值,这样升序排列负值就等价于原数值的降序排列,满足组内按费率从高到低排序

代码实现

import pandas as pd

# 你的示例数据
data = {
    'Superheros': ['Spiderman (Nr 1)', 'Batman (Nr 4)', 'Joker', 'Iron Man (Nr 2)', 'Hulk', 'Captain America', 'Wonderwoman (Nr 3)'],
    'hourly rate': [12.9, 93.7, 23.6, 49.3, 32.5, 24.9, 65.8]
}
df = pd.DataFrame(data)

# 一步完成排序
df_sorted = df.sort_values(
    key=lambda row: (
        row['Superheros'].str.contains(r'\(Nr \d+\)'),  # 第一排序维度:是否含编号,False在前
        -row['hourly rate']  # 第二排序维度:费率降序
    )
)

print(df_sorted)

输出结果

Superheros  hourly rate
4               Hulk         32.5
5  Captain America         24.9
2              Joker         23.6
1       Batman (Nr 4)         93.7
6  Wonderwoman (Nr 3)         65.8
3    Iron Man (Nr 2)         49.3
0   Spiderman (Nr 1)         12.9

为什么之前的方法不适用?

你之前尝试把by='Superheros'改成by='hourly rate',但原key函数是针对Superheros列设计的——它提取编号来排序。当by换成hourly rate后,key函数会作用在浮点类型的费率列上,自然无法正确识别编号规则,导致逻辑失效。而我们的复合键方法直接针对整个行生成排序依据,完美匹配你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 22:04:04