使用pandas读取表格时出现IndexError错误

5

更新:这是 "usecols with parse_dates and names" 的重复问题,但是这个问题先被回答了。


我无论如何都无法让这段代码工作。一旦我去掉 names 参数,它就可以正常工作,但这太愚蠢了。

从一个以空格分隔的文件中,我想要:

  • 跳过头部部分
  • 导入选定的列
  • 给列命名
  • 解析两列作为日期
  • 使用解析后的日期作为索引

这几乎可以工作:

import panadas as pd
columns = [4, 5, 10, 11, 15, 16, 17, 26, 28, 29]
names = ["DATE","TIME","DLAT", "DLON", "SLAT", "SLON", "SHGT", "HGT", "N", "E"]
ppp_data = pd.read_table(
    filename,
    delim_whitespace=True, # space delimited
    skiprows=8, # skip header rows
    header=None, # don't use first row as column names
    usecols=columns, # only use selected columns
    names=names, # use names for selected columns
    parse_dates=[[4,5]], # join date and time columns and parse as date
    index_col=0, # use parsed date (now column 0) as index
)
print ppp_data

但是这里是我收到的堆栈跟踪信息:

Traceback (most recent call last):
  File "plot_squat_test_pandas.py", line 30, in <module>
    index_col=0,
  File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 400, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 205, in _read
    return parser.read()
  File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 608, in read
    ret = self._engine.read(nrows)
  File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 1028, in read
    data = self._reader.read(nrows)
  File "parser.pyx", line 706, in pandas.parser.TextReader.read (pandas/parser.c:6745)
  File "parser.pyx", line 728, in pandas.parser.TextReader._read_low_memory (pandas/parser.c:6964)
  File "parser.pyx", line 804, in pandas.parser.TextReader._read_rows     (pandas/parser.c:7780)
  File "parser.pyx", line 865, in pandas.parser.TextReader._convert_column_data (pandas/parser.c:8512)
  File "parser.pyx", line 1105, in pandas.parser.TextReader._get_column_name (pandas/parser.c:11684)
IndexError: list index out of range

如果我注释掉names=names参数,那么它就能正常工作。
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 86281 entries, 2013-10-30 00:00:00 to 2013-10-30 23:59:59
Data columns (total 8 columns):
10    86281  non-null values
11    86281  non-null values
15    86281  non-null values
16    86281  non-null values
17    86281  non-null values
26    86281  non-null values
28    86281  non-null values
29    86281  non-null values

我错过了什么?还是这是pandas的问题,我应该去报告一个错误?

我正在使用python 2.7.3,并且使用pandas,上面的堆栈跟踪来自稳定版本0.12.0。我已经尝试过开发版本0.13.0rc1-119-g2485e09,结果相同(不同的行号)。

2个回答

4
这是在当前开发版本0.13.0rc1-119-g2485e09之前的pandas版本中存在的错误。有两种解决方法。

解决方法1

usecolsnames中都包含表格的最后一列将会抑制IndexError

from StringIO import StringIO
import pandas as pd

data = """2013-10-11 11:53:49,1,2,3,4
2013-10-11 11:53:50,1,2,3,4
2013-10-11 11:53:51,1,2,3,4"""

df = pd.read_csv(
    StringIO(data),
    header=None,
    usecols=[0,2,4],
    names=["DATE","COl2","COL4"],
    parse_dates=["DATE"],
    index_col=0,
)
print df

解决方法2

或者您可以在操作之后使用rename命令来重命名列,就像这个问题所示。

ppp_data.rename(columns=dict(zip(columns[2:],names)), inplace=True)

1

names有10个元素:

In [1]: len(["DATE","TIME","DLAT", "DLON", "SLAT", "SLON", "SHGT", "HGT", "N", "E"])
Out[1]: 10

但是当您省略 names 参数时,read_table 仅解析了 8 列:
Data columns (total 8 columns):

因此,如果所需的DataFrame具有8个列和单个索引,则“names”可能具有9(或8)个元素。
请注意:
parse_dates=[[4,5]],    

将第4列和第5列合并为一列。所以尽管原始数据有10列,但剩下的是8列和一个索引。如果您使 names 具有9个元素,则第一个元素用于命名索引。

如果我切换到8或9个列名,就会出现“ValueError: Passed header names mismatches usecols”的错误。我尝试从“usecols”参数中删除第4和第5列,只使用8个数据列的名称。与之前相同的结果,“IndexError”。 - Weston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接