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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 20:24:31