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

如何高效转换Polars中含键值对的字符串列?

Polars 键值对字符串转独立列的高效实现

针对你需求的场景,完全可以用Polars内置的向量化操作实现高效转换,无需提前预处理所有可能的键,自动识别所有出现的键并生成对应列,缺失值自动填充为null。以下是两种简洁高效的实现方式:

方法一:基于字符串分割与Struct处理

import polars as pl

# 原始DataFrame
df = pl.DataFrame({
    "apple": [1, 2, 3],
    "data": ["a=b, b=c", "a=y, y=z", "k1=v1, k2=v2"]
})

# 转换逻辑
result = (
    df
    .with_row_index()  # 添加临时索引用于后续合并
    .with_columns(
        # 将data列拆分为键值对列表,再转为Struct格式
        pl.col("data")
        .str.split(", ")
        .list.eval(pl.element().str.split("=", 1))
        .list.eval(pl.struct(key=pl.element()[0], value=pl.element()[1]))
        .alias("key_value")
    )
    .explode("key_value")  # 展开每个键值对
    .pivot(
        index="index",
        columns="key_value.key",
        values="key_value.value",
        aggregate_function=lambda x: x.first()
    )
    .join(df.with_row_index(), on="index", how="left")  # 合并回原始数据
    .drop("index")  # 移除临时索引
    .select(pl.col("apple"), pl.exclude("apple", "data"), pl.col("data"))  # 调整列顺序
)

print(result)

方法二:基于正则提取(更简洁)

如果键值对的格式比较规范,用正则提取会更简洁:

result = (
    df
    .with_row_index()
    .with_columns(
        # 用正则匹配所有键值对,捕获键和值
        pl.col("data").str.extract_all(r"([^=]+)=([^,]+)").alias("matches")
    )
    .explode("matches")
    .with_columns(
        pl.col("matches").list.get(0).alias("key"),
        pl.col("matches").list.get(1).alias("value")
    )
    .pivot(index="index", columns="key", values="value")
    .join(df.with_row_index(), on="index")
    .drop("index")
    .select("apple", pl.exclude("apple", "data"), "data")
)

核心优势

  • 无需预处理:自动从数据中识别所有出现的键,无需提前枚举所有可能的键
  • 高效向量化:所有操作都是Polars内置的向量化运算,性能远优于Python循环或手动处理
  • 自动填充缺失值:pivot操作会自动为不存在的键填充null

内容的提问来源于stack exchange,提问作者Chris Wong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 16:04:51