Pandas Chunksize迭代器

时间:2017-11-01 20:20:16

标签: python pandas

我有一个1GB,70M的行文件,无论何时加载它都会耗尽内存。我已经阅读了1000行,并且能够制作我想要它的原型。

我的问题是不知道如何获取接下来的1000行并应用我的逻辑,然后继续运行我的文件直到它完成最后一行。我已经阅读了关于chunksizing的内容,虽然我无法弄清楚如何继续进行chunksizing的迭代。

理想情况下,它会像这样流动:

1)读入前1000行 2)根据标准过滤数据 3)写入csv 4)重复直到不再有行

这是我到目前为止所拥有的:

import pandas as pd
data=pd.read_table('datafile.txt',sep='\t',chunksize=1000, iterator=True)
data=data[data['visits']>10]
with open('data.csv', 'a') as f:
    data.to_csv(f,sep = ',', index=False, header=False)

2 个答案:

答案 0 :(得分:5)

您的逻辑存在一些问题,我们希望循环数据中的每个块,而不是数据本身。

'chunksize'参数为我们提供了一个可以迭代的'textreader对象'。

import pandas as pd
data=pd.read_table('datafile.txt',sep='\t',chunksize=1000)

for chunk in data:
    chunk = chunk[chunk['visits']>10]
    chunk.to_csv('data.csv', index = False, header = False)

您需要考虑如何处理标题!

答案 1 :(得分:2)

当您传递chunksizeiterator=True时,pd.read_table会返回您可以迭代或致电get_chunk的TextFileReader。因此,您需要在get_chunk上迭代或致电data

因此,对整个文件的正确处理可能类似于

import pandas as pd

data = pd.read_table('datafile.txt',sep='\t',chunksize=1000, iterator=True)

with open('data.csv', 'a') as f:
    for chunk in data:
        chunk[chunk.visits > 10].to_csv(f, sep=',', index=False, header=False)