我使用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]
)。所有列表值都在数据框的第一个和最后一个元素的索引之间。
为什么我会收到此错误?
答案 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]
现在您有一个要保留的行的位置列表,您可以按预期使用该内容。
如果词汇(位置和索引)不合适,请告诉我,以便我能纠正。我不是母语为英语的人,这个词的含义在这个问题上非常重要。