Pandas dataframe take 引发索引越界

Pandas dataframe take raises indices out-of-bounds

我正在使用 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: indices are out-of-bounds

我打印了数据框第一个和最后一个元素的列表值和索引(使用 combined_csv.index[0]combined_csv.index[-1])。 indices_to_keep 列表中的所有值都在数据框第一个和最后一个元素的索引定义的边界内。

为什么我会收到这个错误?

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

An array of ints indicating which positions to take

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

假设您的块大小为 40000。从第二个块构建的数据框的第一个 index 将为 40000。但是,position 该行的值为 0,这就是 take 期望的位置值。

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

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

现在您有了要保留的行的 位置 的列表,您可以按预期使用 take。

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