如何简化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 │ └───────┴──────────────┴──────────────┴──────────────┴──────────────┘
方案优势
- 避免重复代码:通过循环批量生成处理逻辑,不需要对每一列重复写拆分、转换的代码
- 扩展性强:后续如果需要处理更多类似的逗号分隔列,只需将列名添加到
cols_to_process列表即可 - 更高效直接:用
list.get直接提取目标元素,省去了转结构体、unnest、重命名中间字段的步骤
内容的提问来源于stack exchange,提问作者darked89
相关产品推荐
相关产品推荐

