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

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

解决方案

问题原因

  1. 使用numpy.random.choice生成的数组混合了None和字符串,导致Polars将列识别为Object类型,直接调用cast(pl.Utf8)会触发转换失败。
  2. 原代码中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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 18:22:29