Pandas数据框引发索引超出范围

时间:2018-03-20 14:24:00

标签: python pandas dataframe chunks

我使用pandas.DataFrame.take仅保留数据帧的某些行(一列中的值与某个正则表达式匹配)。

为了做到这一点,我正在建立一个索引列表,以便在循环中检查每一行是否与模式匹配:

for index, row in combined_csv.iterrows():
     if re.match(regex_files_to_keep, row['commit_file']):
          indices_to_keep.append(index)

索引值因此由pandas.DataFrame.iterrows返回。

我的数据集存储为CSV文件。它太大了,无法一次阅读,我正在使用pandas.read_csv的chunksize参数。

应用于第一个块的take没有任何问题。但是,从第二个块开始,它会引发以下错误:

  

IndexError:指数超出范围

我打印了列表值以及数据框的第一个和最后一个元素的索引(使用combined_csv.index[0]combined_csv.index[-1])。所有列表值都在数据框的第一个和最后一个元素的索引之间。

为什么我会收到此错误?

1 个答案:

答案 0 :(得分:1)

答案是pandas.DataFrame.take方法将当前数据框中要删除的行的位置作为参数,而不是索引。混淆来自参数名称​​ indices ,但文档明确指出:

  

一系列整数,表明要采取的位置

让我用一个例子来解释它的区别。

假设您有40000的块大小。从第二个块构建的数据框的第一个索引将是40000.但是,此行的位置是0,这是take期待的位置值。

这就是为什么你需要从你的索引中减去你已经经过的行数(chunksize *(chunk_number - 1))。我对应的代码行是:

indices_to_keep = [x - (chunk_size * (chunk_number - 1)) for x in indices_to_keep]

现在您有一个要保留的行的位置列表,您可以按预期使用该内容。

如果词汇(位置和索引)不合适,请告诉我,以便我能纠正。我不是母语为英语的人,这个词的含义在这个问题上非常重要。