
本文旨在提供一个清晰、高效的解决方案,将 Polars DataFrame 中包含逗号分隔整数的字符串列转换为多个整数列。我们将探讨多种方法,包括使用 `.str.strip_chars()`, `.cast()`, `.list.to_struct()` 以及 `unpivot` 和 `pivot` 操作,并提供示例代码和详细解释,帮助你轻松处理 BED12 格式或其他类似的数据转换需求。
在使用 Polars 处理数据时,经常会遇到需要将包含逗号分隔值的字符串列转换为数值列的情况。例如,在处理 BED12 格式的数据时,blockSizes 和 blockStarts 列通常以字符串形式存储,其中包含逗号分隔的整数。本教程将介绍几种使用 Polars 将这些字符串列转换为整数列的有效方法。
这种方法的核心思想是首先去除字符串末尾的逗号,然后将字符串分割成列表,接着将列表转换为结构体,最后解包结构体。
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 = "blockSizes", "blockStarts"
df = df.with_columns(
pl.col(col)
.str.strip_chars(",")
.str.split(",")
.cast(pl.List(pl.Int32))
.list.to_struct(
n_field_strategy = "max_width",
fields = lambda idx, col=col: f"{col}_{idx}"
)
for col in cols
).unnest(cols)
print(df)代码解释:
优点:
注意事项:
为了提高代码的可重用性,可以将上述逻辑封装成一个函数。
import polars as pl
def csv_to_struct(col):
expr = pl.col(col).str.strip_chars(",").str.split(",")
expr = expr.cast(pl.List(pl.Int32))
return expr.list.to_struct(
n_field_strategy = "max_width",
fields = lambda idx: f"{col}_{idx}"
)
cols = "blockSizes", "blockStarts"
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,"]
})
df = df.with_columns(map(csv_to_struct, cols)).unnest(cols)
print(df)代码解释:
优点:
这种方法通过将数据进行长宽表转换来实现列的转换。
import polars as pl
cols = "blockSizes", "blockStarts"
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,"]
})
df = (df.with_row_index()
.with_columns(
pl.col(cols).str.strip_chars(",").str.split(",").cast(pl.List(pl.Int32))
)
.explode(cols)
.unpivot(index=["index", "chrom"], variable_name="name")
.with_columns(
pl.format("{}_{}",
"name",
pl.col("index").cum_count().over("index", "name") - 1
)
)
.pivot(on="name", index=["index", "chrom"]))
print(df)代码解释:
优点:
缺点:
本教程介绍了三种使用 Polars 将包含逗号分隔整数的字符串列转换为整数列的方法。第一种方法使用 str.strip_chars(), cast(), 和 list.to_struct(),代码简洁高效,推荐使用。第二种方法将第一种方法封装成函数,提高了代码的可重用性。第三种方法使用 unpivot 和 pivot,适用于需要更灵活地控制列转换过程的场景。选择哪种方法取决于具体的应用场景和个人偏好。无论选择哪种方法,都需要确保字符串列中的值都是有效的整数,否则转换操作会失败。希望本教程能够帮助你更好地使用 Polars 处理数据。
以上就是使用 Polars 将字符串列转换为整数列:高效处理 BED12 格式数据的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号