Pandas如何按条件将匹配行排序后移动到DataFrame末尾
Pandas 实现带编号行按序移至末尾的方案
你最初想到的辅助列思路其实是性能最好、代码最简洁的实现方向,完全不需要逐行移动或者拆分表格拼接,几行代码就能搞定,还能保留非匹配行的原有顺序。
核心逻辑
利用pandas的稳定排序特性:
- 用正则提取
Superheros列中(Nr 数字)格式里的数值,没有匹配到该格式的行统一赋予最小排序权重 - 排序时非匹配行因为权重相同,稳定排序会完全保留它们原本的相对顺序;匹配到编号的行会按照编号数值从小到大自动排在表格末尾,正好符合需求
- 不需要真的把辅助列写入DataFrame,也不用拆分表格做二次拼接
完整实现代码
import pandas as pd # 测试用示例数据 df = pd.DataFrame({ "Superheros": [ "Spiderman (Nr 1)", "Batman (Nr 4)", "Joker", "Iron Man (Nr 2)", "Hulk", "Captain America", "Wonderwoman (Nr 3)" ] }) # 提取Nr后的数字,未匹配内容返回空值 nr_rank = df["Superheros"].str.extract(r"\(Nr (\d+)\)", expand=False).astype(float) # 稳定排序:空值填负无穷排最前,匹配到的按数字升序排列 df_result = df.sort_values(by=nr_rank.fillna(float("-inf")), kind="stable", ignore_index=True)
运行结果
执行后输出的df_result完全匹配预期:
Superheros 0 Joker 1 Hulk 2 Captain America 3 Spiderman (Nr 1) 4 Iron Man (Nr 2) 5 Wonderwoman (Nr 3) 6 Batman (Nr 4)
注意事项
- pandas没有内置
move_to方法,逐行定位移动的写法不仅需要额外写循环枚举编号,数据量较大时性能会非常差,不推荐使用 - 参数
kind="stable"是保留非匹配行原有顺序的关键,不要省略 - 正则
\(Nr (\d+)\)可以自动识别任意长度的数字编号,不需要手动适配Nr 1、Nr 2这类固定值
内容的提问来源于stack exchange,提问作者Carina
相关产品推荐
相关产品推荐

