如何按含文本与数字的列对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
相关产品推荐
相关产品推荐

