Polars中pl.Object转pl.Utf8失败,求列字符最小长度获取方法
问题:Polars中Object类型转Utf8失败,无法获取字符最小长度
尝试将Polars的pl.Object类型列转换为pl.Utf8类型,最终目标是获取该列字符的最小长度,但转换时失败。
数据示例
shape: (5, 1) ┌───────────────────────┐ │ date_strings_missings │ │ --- │ │ object │ ╞═══════════════════════╡ │ 03.05.1834 │ │ 03.05.1834 │ │ 05.06.2025 │ │ │ │ 03.05.1834 │ └───────────────────────┘
报错代码
import polars as pl import numpy as np N = 100 data = pl.DataFrame( data={ "date_strings_missings": np.random.choice( [None, "", "03.04.1998", "03.05.1834", "05.06.2025"], N ), } ) print(data.head()) col = "date_strings_missings" n_char = ( data[col] .drop_nulls() .cast(pl.Utf8) .set(data[col].str.lengths() == 0, None) .drop_nulls() .str.n_chars() .min() )
异常信息
Exceptions.ComputeError: cannot cast 'Object' type
解决方案
问题原因
- 使用
numpy.random.choice生成的数组混合了None和字符串,导致Polars将列识别为Object类型,直接调用cast(pl.Utf8)会触发转换失败。 - 原代码中
data[col].str.lengths()的写法无效,因为Object类型列无法直接调用字符串方法。
修正代码
import polars as pl import numpy as np N = 100 data = pl.DataFrame( data={ "date_strings_missings": np.random.choice( [None, "", "03.04.1998", "03.05.1834", "05.06.2025"], N ), } ) col = "date_strings_missings" # 先替换空字符串为None,再安全转换为Utf8类型,最后计算最小字符长度 n_char = ( data .with_columns( pl.col(col).replace("", None).cast(pl.Utf8) ) .drop_nulls(col) .select(pl.col(col).str.n_chars().min()) .item() ) print(n_char)
说明
- 先用
replace("", None)将空字符串转为None,避免后续计算时将空字符串的0长度纳入统计。 - 调用
cast(pl.Utf8)将Object类型安全转换为Utf8字符串类型。 - 过滤掉空值后,通过
str.n_chars()获取每个字符串的字符长度,最后取最小值。
内容的提问来源于stack exchange,提问作者SysRIP
相关产品推荐
相关产品推荐

