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

求助:Polars LazyFrame字符串列拆分生成新列的实现方法

解决Polars LazyFrame拆分字符串为多列的问题

针对你需要拆分CSV列并生成单独列的需求,这里提供两种高效的LazyFrame实现方案:

方案一:使用str.split_exact直接生成Struct并展开

这个方法最适合明确知道拆分后列数的场景(比如你的例子中拆分后是2列),效率更高,无需先生成列表再处理:

import polars as pl

# 创建LazyFrame 
lf = pl.LazyFrame({
    "sample": ["ENST123456768.19", "ENST987654321.20", "ENST567890123.21"], 
    "banananana": ["chiqita", "baaan", "banabana"]
})

# 拆分sample列:split_exact指定分隔符和拆分次数(1次),生成包含两个字段的struct
lf = lf.with_columns(
    pl.col("sample").str.split_exact(".", 1).alias("split_sample")
).unnest("split_sample")  # 展开struct为单独列
# 重命名列到你需要的名称
lf = lf.rename({"field_0": "sample", "field_1": "version"})

lf.sink_parquet('test.parquet')

test_Df = pl.read_parquet('test.parquet')
print(test_Df.head())

运行后会得到你期望的输出结构:

shape: (3, 3)
┌────────────────────┬─────────┬────────────┐
│ sample             ┆ version ┆ banananana │
│ ---                ┆ ---     ┆ ---        │
│ str                ┆ str     ┆ str        │
╞════════════════════╪═════════╪════════════╡
│ ENST123456768      ┆ 19      ┆ chiqita    │
│ ENST987654321      ┆ 20      ┆ baaan      │
│ ENST567890123      ┆ 21      ┆ banabana   │
└────────────────────┴─────────┴────────────┘

方案二:从已生成的列表列提取元素

如果已经有了拆分后的列表列,可以通过list.get()索引提取元素生成新列:

import polars as pl

lf = pl.LazyFrame({
    "sample": ["ENST123456768.19", "ENST987654321.20", "ENST567890123.21"], 
    "banananana": ["chiqita", "baaan", "banabana"]
})

# 先拆分得到列表列,再提取元素生成新列
lf = lf.with_columns(
    pl.col("sample").str.split(".").alias("sample_list")
).with_columns(
    pl.col("sample_list").list.get(0).alias("sample"),
    pl.col("sample_list").list.get(1).alias("version")
).drop("sample_list")  # 移除临时列表列

lf.sink_parquet('test.parquet')

两种方案都完全适配LazyFrame的惰性计算,不会一次性加载30GB数据到内存,适合处理大文件场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 20:13:12