Polars read_excel 错误地向列名称添加后缀

问题描述 投票:0回答:1

我正在使用 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”列开始读取。

我想知道发生了什么事?这是一个错误还是我犯了一个错误?

python python-polars
1个回答
0
投票

我不认为你犯了一个错误,不同引擎之间的行为似乎有很大差异,而且它们都没有做你想做的事:

我有以下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
  • 中提到的列

Xlsx2csv(之前的默认值)

┌─────────┬───────────────────┐
│ foxtrot ┆ alfa_duplicated_0 │
│ ---     ┆ ---               │
│ i64     ┆ str               │
╞═════════╪═══════════════════╡
│ 1       ┆ a                 │
└─────────┴───────────────────┘

alfa_duplicated_0
值来自最后一个
alfa

是的,真的,它完全放弃了查理、德尔塔、回声和狐步舞。我认为这是一个直接的错误。如果从 0 开始索引并列出所有列,它会显示所有列,但如果从 1 开始,它已经删除了

alfa
AND
bravo

打开pyxl

┌───────┬──────┬─────────┐
│ 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"]
© www.soinside.com 2019 - 2024. All rights reserved.