求助: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
相关产品推荐
相关产品推荐

