如何通过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




