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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 13:06:26