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

如何简化Polars中BED12字符串列转整数列的操作?

简化BED12格式TSV转Polars DataFrame的逗号分隔列处理

你可以通过批量生成处理表达式的方式避免重复代码,扩展性更强,同时用list.get直接提取元素比转结构体的方式更简洁高效:

import polars as pl

# 示例数据
df = pl.DataFrame(
    {
        "chrom": ["1", "1", "2", "X"],
        "blockSizes": ["10,29,", "20,22,", "30,25,", "40,23,"],
        "blockStarts": ["0,50,", "0,45,", "0,60,", "0,70,"]
    })

# 定义需要处理的目标列
cols_to_process = ["blockSizes", "blockStarts"]
expressions = []

# 循环生成每一列的处理表达式
for col in cols_to_process:
    expressions.extend([
        # 提取第0个元素并转为整数
        pl.col(col).str.split(",").list.get(0).cast(pl.Int32).alias(f"{col}_0"),
        # 提取第1个元素并转为整数
        pl.col(col).str.split(",").list.get(1).cast(pl.Int32).alias(f"{col}_1")
    ])

# 应用表达式并删除原列
result_df = df.with_columns(expressions).drop(cols_to_process)
print(result_df)

执行结果

shape: (4, 5)
┌───────┬──────────────┬──────────────┬──────────────┬──────────────┐
│ chrom ┆ blockSizes_0 ┆ blockSizes_1 ┆ blockStarts_0┆ blockStarts_1│
│ ---   ┆ ---          ┆ ---          ┆ ---          ┆ ---          │
│ str   ┆ i32          ┆ i32          ┆ i32          ┆ i32          │
╞═══════╪══════════════╪══════════════╪══════════════╪══════════════╡
│ 1     ┆ 10           ┆ 29           ┆ 0            ┆ 50           │
│ 1     ┆ 20           ┆ 22           ┆ 0            ┆ 45           │
│ 2     ┆ 30           ┆ 25           ┆ 0            ┆ 60           │
│ X     ┆ 40           ┆ 23           ┆ 0            ┆ 70           │
└───────┴──────────────┴──────────────┴──────────────┴──────────────┘

方案优势

  1. 避免重复代码:通过循环批量生成处理逻辑,不需要对每一列重复写拆分、转换的代码
  2. 扩展性强:后续如果需要处理更多类似的逗号分隔列,只需将列名添加到cols_to_process列表即可
  3. 更高效直接:用list.get直接提取目标元素,省去了转结构体、unnest、重命名中间字段的步骤

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 02:14:54