我正在使用 Polars v1.12.0 从 Excel 工作表中读取数据。
pl.read_excel(
"test.xlsx",
sheet_name="test",
has_header=True,
columns=list(range(30, 49))
)
请求的列已正确导入。但是,Polars 为每个列名称添加后缀
_1
。有一个列标题添加了 _3
。
在请求的列中,所有列标题都是唯一的,即没有重复项。但是,此导入区域之前的列确实具有相同的值。例如,带有
_3
后缀的标头确实在我的导入区域之前出现了两次。
看起来 Polars 正在扫描从“A”列开始的所有列标题,无论我是否从“AE”列开始读取。
我想知道发生了什么事?这是一个错误还是我犯了一个错误?
我不认为你犯了一个错误,不同引擎之间的行为似乎有很大差异,而且它们都没有做你想做的事:
我有以下Excel:
alpha | bravo | charlie | charlie | delta | echo | foxtrot | alfa
1 | a | 1 | a | 1 | a | 1 | a
对于以下代码片段:
df = pl.read_excel(
"test.xlsx",
sheet_name="test",
has_header=True,
columns=[3, 4, 5, 6, 7],
)
这是我使用不同 Excel 引擎时得到的结果:
┌───────────┬───────┬──────┬─────────┬────────┐
│ charlie_1 ┆ delta ┆ echo ┆ foxtrot ┆ alfa_1 │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ str ┆ i64 ┆ str │
╞═══════════╪═══════╪══════╪═════════╪════════╡
│ a ┆ 1 ┆ a ┆ 1 ┆ a │
└───────────┴───────┴──────┴─────────┴────────┘
其中
charlie_1
和 alfa_1
值取自名为 charlie
和 alfa
的 最后一列。所以顺序似乎是:
columns
┌─────────┬───────────────────┐
│ foxtrot ┆ alfa_duplicated_0 │
│ --- ┆ --- │
│ i64 ┆ str │
╞═════════╪═══════════════════╡
│ 1 ┆ a │
└─────────┴───────────────────┘
alfa_duplicated_0
值来自最后一个 alfa
。
是的,真的,它完全放弃了查理、德尔塔、回声和狐步舞。我认为这是一个直接的错误。如果从 0 开始索引并列出所有列,它会显示所有列,但如果从 1 开始,它已经删除了
alfa
AND bravo
。
┌───────┬──────┬─────────┐
│ delta ┆ echo ┆ foxtrot │
│ --- ┆ --- ┆ --- │
│ i64 ┆ str ┆ i64 │
╞═══════╪══════╪═════════╡
│ 1 ┆ a ┆ 1 │
└───────┴──────┴─────────┘
现在删除所有具有重复名称的列first,然后采用
columns
中定义的列索引。严格来说,连掉落都算不上,但是
columns
中的索引过滤列,而不考虑重复的名称第 3、4 和 5 列现在
delta, echo foxtrot
,第 6 和 7 列无处指向。
因此,基于此,我认为最好的选择是使用默认的
calamine
引擎,然后手动覆盖列:
df.columns = ["charlie", "delta", "echo", "foxtrot", "alfa"]