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

如何按含文本与数字的列对Polars DataFrame进行自然排序

按Name列中的数值对Polars DataFrame排序

先给出示例DataFrame的创建代码,方便你测试:

import polars as pl

df = pl.DataFrame({
    "Name": ["No. 1", "No. 10", "No. 2"],
    "Value": [["None", "!!!"], ["0.3", "OK"], ["1.1", "OK"]]
})

这里有两种可行的方案,优先推荐使用Polars内置的向量化表达式,性能更好:

方法一:使用Polars内置表达式(推荐)

利用str.extract提取Name中的数字部分,转成整数后作为排序依据,全程是向量化操作,效率更高:

sorted_df = df.sort(by=pl.col("Name").str.extract(r"\d+", 0).cast(pl.Int32))
print(sorted_df)

输出结果:

┌────────┬──────────────────────┐
│ Name   ┆ Value                │
│ ---    ┆ ---                  │
│ str    ┆ list[str]            │
╞════════╪══════════════════════╡
│ No. 1  ┆ ["None", "!!!"]      │
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ No. 2  ┆ ["1.1", "OK"]        │
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ No. 10 ┆ ["0.3", "OK"]        │
└────────┴──────────────────────┘

说明

  • str.extract(r"\d+", 0):用正则匹配字符串中的连续数字部分
  • cast(pl.Int32):把匹配到的数字字符串转成整数,确保排序是按数值大小而非字符串字典序

方法二:使用自定义Python函数(不推荐,仅作参考)

Polars支持用map_elements传入自定义函数,但这是逐行处理逻辑,数据量大时性能会明显低于向量化操作:

def extract_number(name):
    return int(name.split()[-1])

sorted_df = df.sort(by=pl.col("Name").map_elements(extract_number, return_dtype=pl.Int32))
print(sorted_df)

输出结果和方法一完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 03:35:42