如何在Polars中按数字对字符串类型hotel_id进行自然排序?
Polars实现hotel_id自然排序解决方案
原问题场景
当前代码按hotel_id字典序排序会出现h_1后紧跟h_10的情况,要实现按hotel_id中的数字进行自然排序,核心是提取字符串中的数字部分并转为数值类型,基于该数值排序。
方法一:提取临时数字列排序(兼容所有Polars版本)
先通过正则提取hotel_id中的数字,生成临时列,按该列排序后可选择删除临时列:
import polars as pl result = ( reseve_tb .group_by("hotel_id") .agg( pl.col("total_price").var().fill_null(0).alias("price_var"), pl.col("total_price").std().fill_null(0).alias("price_std") ) # 提取hotel_id中的数字并转为整数 .with_columns(pl.col("hotel_id").str.extract(r"(\d+)").cast(pl.Int32).alias("hotel_num")) .sort("hotel_num") # 基于数字列自然排序 .drop("hotel_num") # 可选:删除临时生成的数字列 )
方法二:使用sort的key参数(Polars 0.19+版本推荐)
Polars 0.19及以上版本支持sort方法的key参数,无需生成临时列,直接指定排序逻辑:
import polars as pl result = ( reseve_tb .group_by("hotel_id") .agg( pl.col("total_price").var().fill_null(0).alias("price_var"), pl.col("total_price").std().fill_null(0).alias("price_std") ) .sort( by="hotel_id", # 定义排序键:提取数字并转为整数 key=lambda s: s.str.extract(r"(\d+)").cast(pl.Int32) ) )
关键说明
- 正则表达式
r"(\d+)"用于匹配hotel_id中的连续数字字符,确保精准提取数字部分。 - 转为整数类型后,排序逻辑会遵循数值大小,而非字符串字典序,从而实现
h_1→h_2→…→h_9→h_10的自然排序。
内容的提问来源于stack exchange,提问作者ponda
相关产品推荐
相关产品推荐

