在阅读Excel文件时,让pandas使用基于0的行号作为索引

时间:2016-09-11 21:02:55

标签: pandas

我正在尝试使用pandas来处理一系列XLS文件。我目前使用的代码如下:

with pandas.ExcelFile(data_file) as xls:
    data_frame = pandas.read_excel(xls, header=[0, 1], skiprows=2, index_col=None)

XLS文件的格式类似于

+---------------------------------------------------------------------------+
|                                   REPORT                                  |
+---------------------------------------------------------------------------+
| Unit: 1000000 USD                                                         |
+---------------------------------------------------------------------------+
|        |         |             |               |          Balance         |
+   ID   +  Branch + Customer ID + Customer Name +--------------------------+
|        |         |             |               | Daily | Monthly | Yearly |
+--------+---------+-------------+---------------+-------+---------+--------+
| 111111 | Branch1 | 1           | Company A     | 10    | 5       | 2      |
+--------+---------+-------------+---------------+-------+---------+--------+
| 222222 | Branch2 | 2           | Company B     | 20    | 25      | 20     |
+--------+---------+-------------+---------------+-------+---------+--------+
| 111111 | Branch1 | 3           | Company C     | 30    | 35      | 40     |
+--------+---------+-------------+---------------+-------+---------+--------+

即使我明确地给了index_col=None,大熊猫仍然会以ID列作为索引。我想知道将行号作为索引的正确方法。

1 个答案:

答案 0 :(得分:4)

pandas目前不支持在不解析行索引的情况下解析MultiIndex列。相关问题here - 它可能得到支持,但以非模棱两可的方式定义会变得棘手。

这是一个黑客攻击,但现在解决这个问题的最简单方法是在数据左侧添加一个空白列,然后像这样读取它。

pd.read_excel('file.xlsx', header=[0,1], skiprows=2).reset_index(drop=True)

编辑:

如果您不想/不想修改文件,可以选择以下几个选项:

  1. 如果数据有已知/公共标题,请使用pd.read_excel(..., skiprows=4, header=None)并自行分配列,由@ayhan建议。

  2. 如果您需要解析标题,请使用pd.read_excel(..., skiprows=2, header=0),然后将第二级标签变为MultiIndex。这可能会弄乱dtypes,所以你可能还需要做一些类型转换(pd.to_numeric)。