我有一个 tsv 文件,其中包含带千位分隔符的整数。我尝试使用 读取它polars==1.6.0
,编码为utf-16
from io import BytesIO
import polars as pl
data = BytesIO(
"""
Id\tA\tB
1\t537\t2,288
2\t325\t1,047
3\t98\t194
""".encode("utf-16")
)
df = pl.read_csv(data, encoding="utf-16", separator="\t")
print(df)
我无法弄清楚如何让极坐标将“B”列视为整数而不是字符串,而且我也找不到将其转换为整数的干净方法。
shape: (3, 3)
┌────────┬─────┬───────┐
│ Id ┆ A ┆ B │
│ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ str │
╞════════╪═════╪═══════╡
│ 1 ┆ 537 ┆ 2,288 │
│ 2 ┆ 325 ┆ 1,047 │
│ 3 ┆ 98 ┆ 194 │
└────────┴─────┴───────┘
转换失败,显式传递架构也是如此。我还尝试使用str.strip_chars
和删除逗号,我的解决方法是改用str.replace_all
。
df = df.with_columns(
pl.col("B").str.strip_chars(",").alias("B_strip_chars"),
pl.col("B").str.replace_all("[^0-9]", "").alias("B_replace"),
)
print(df)
shape: (3, 5)
┌────────┬─────┬───────┬───────────────┬───────────┐
│ Id ┆ A ┆ B ┆ B_strip_chars ┆ B_replace │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ str ┆ str ┆ str │
╞════════╪═════╪═══════╪═══════════════╪═══════════╡
│ 1 ┆ 537 ┆ 2,288 ┆ 2,288 ┆ 2288 │
│ 2 ┆ 325 ┆ 1,047 ┆ 1,047 ┆ 1047 │
│ 3 ┆ 98 ┆ 194 ┆ 194 ┆ 194 │
└────────┴─────┴───────┴───────────────┴───────────┘
此外,为了使其正常工作,我需要确保read_csv
不会尝试推断任何列的类型,以便我可以手动转换它们(任何值 > 999 的数字列都将包含逗号)
为了允许可能的多个
,
分隔符,请使用.str.replace_all:给出样本数据:
如果您的源数据是 utf-16(或除 utf-8 之外的任何格式),则 polars 将通过 python 将其转换为 utf-8。由于无论如何都需要这样做,因此最好自己进行转换并替换中间的“,”以便本机 polars csv 阅读器在
read_csv
前面而不是在后续步骤中将数据解析为数字只是要强调的是,如果您的源数据已经是 utf-8,那么使用 python 执行此操作
replace
几乎肯定比 @user19077881 的答案慢。仅当您的源不是 utf-8 时才这样做,因为 polars 无论如何都会在 python 中将其转换为 utf-8。当然,如果您的列实际上应该是带逗号的字符串,那么这不起作用,因为它不知道区别。