You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过Polars表达式获取列的压缩后数据类型并执行类型校验?

如何通过Polars表达式获取列的压缩后数据类型并执行类型校验?

当然可以实现啦!你的需求完全可行,不过写法上得调整下,我给你捋捋清楚。

首先要明确:列的压缩后数据类型是针对整个列的(不是每一行单独的类型),所以校验结果是一个全列统一的布尔值,会自动广播到每一行。

具体实现步骤

  • 第一步:先拿到列的压缩后数据类型
    我们可以直接调用列的shrink_dtype()方法,获取到压缩后的DataType对象:

    import polars as pl
    
    df = pl.DataFrame({"list_column": [[1, 2], [3, 4], [5, 6]]})
    # 获取目标列压缩后的类型
    compressed_dtype = df["list_column"].shrink_dtype()
    
  • 第二步:用表达式生成类型校验列
    把类型比较的结果用pl.lit()包装成常量列,再添加到原DataFrame中:

    df = df.with_columns(
        type_check=pl.lit(compressed_dtype == pl.List(pl.Int64))
    )
    

    运行后就能得到你想要的结果:

    shape: (3, 2)
    ┌─────────────┬────────────┐
    │ list_column ┆ type_check │
    │ ---         ┆ ---        │
    │ list[i64]   ┆ bool       │
    ╞═════════════╪════════════╡
    │ [1, 2]      ┆ true       │
    │ [3, 4]      ┆ true       │
    │ [5, 6]      ┆ true       │
    └─────────────┴────────────┘
    

扩展:模糊判断列表类型(不关心内部元素类型)

如果你不需要精确匹配列表内部的元素类型,只是想确认这是个列表类型,那可以这样写:

df = df.with_columns(
    type_check=pl.lit(compressed_dtype.kind == "list")
)

这样不管列表里是i64还是其他数值类型,只要是列表结构就会返回true

说说你原来写法的问题

你之前在pl.lit()里嵌套了pl.col().shrink_dtype()表达式,但pl.lit()是用来包装常量值的,不能直接在里面放Polars表达式,这就导致逻辑出错了。正确的思路是先在Python层面拿到压缩后的类型,再把比较结果作为常量传入pl.lit()

备注:内容来源于stack exchange,提问作者yz_jc

火山引擎 最新活动