如何实现Pandas DataFrame的条件部分排序:按小时费率排序且将带编号超级英雄置于末尾
简洁的Pythonic解决方案
要实现你的需求——先将不含(Nr X)格式的超级英雄按hourly rate降序排列,再将含编号的超级英雄同样按hourly rate降序排列并放在末尾——不需要拆分合并DataFrame,用sort_values的key参数就能一步搞定。
核心思路
我们可以生成一个复合排序键,这个键包含两个维度:
- 标记当前英雄名称是否包含编号(
True表示有编号,False表示无),排序时让False排在前面(无编号组在前) - 取
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
相关产品推荐
相关产品推荐

