奇怪的索引机制Pandas.read_csv具有chunksize选项的函数

2024-05-14 10:44:32 发布

您现在位置:Python中文网/ 问答频道 /正文

由于数据量巨大,我们用熊猫来处理数据,但是出现了一个非常奇怪的现象。伪代码如下所示:

reader = pd.read_csv(IN_FILE, chunksize = 1000, engine='c')
for chunk in reader:
    result = []
    for line in chunk.tolist():
         temp = complicated_process(chunk)  # this involves a very complicated processing, so here is just a simplified version
         result.append(temp)
    chunk['new_series'] = pd.series(result)
    chunk.to_csv(OUT_TILE, index=False, mode='a')

我们可以确认每个循环的结果不是空的。但只有在循环的第一次,行chunk['new_series'] = pd.series(result)才有结果,其余的都是空的。因此,只有输出的第一块包含新的序列,其余部分为空。在

我们错过什么了吗?提前谢谢。在


Tags: csv数据代码innewforresulttemp
2条回答

您应该在循环的上方声明result,否则您只是用每个块重新初始化它。在

result = []
for chunk in reader:
    ...

前面的方法在功能上等效于:

^{pr2}$

另外,我建议:

chunk = chunk.assign(new_series=result)  # Instead of `chunk['new_series'] = pd.series(result)`.

我假设您正在对for loop中的line变量进行操作,即使上面的示例中没有使用它。在

更好的解决方案是:

reader = pd.read_csv(IN_FILE, chunksize = 1000, engine='c')
for chunk in reader:
    result = []
    for line in chunk.tolist():
        temp = complicated_process(chunk)  # this involves a very complicated processing, so here is just a simplified version
        result.append(temp)
    new_chunk = chunk.reset_index()
    new_chunk = new_chunk.assign(new_series=result)
    new_chunk.to_csv(OUT_TILE, index=False, mode='a')

注意:每个块的索引不是单独的,而是从整个文件派生的。如果我们从每个循环中附加一个新序列,块将从整个文件继承索引。因此,每个块和新序列的索引不匹配。在

@Alexander的解决方案是可行的,但是result可能会变得很大,因此它会占用太多内存。在

这里的新解决方案将通过执行new_chunk = chunk.reset_index()来重置每个块的索引,result将在每个循环中重置。这样可以节省大量内存。在

相关问题 更多 >

    热门问题