【问题标题】:Pandas dataframe take raises indices out-of-boundsPandas 数据框使索引超出范围
【发布时间】:2018-03-20 14:23:59
【问题描述】:

我使用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])。 indices_to_keep 列表中的所有值都在数据框的第一个和最后一个元素的索引定义的边界内。

那为什么会出现这个错误呢?

【问题讨论】:

    标签: python pandas dataframe chunks


    【解决方案1】:

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

    一个整数数组,指示要采取的位置

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-07
      • 2018-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多