【问题标题】:Pandas Chunksize iteratorPandas 块大小迭代器
【发布时间】:2017-11-01 20:20:16
【问题描述】:

我有一个 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)

【问题讨论】:

  • 您的计算机有多少内存?文本文件有多少列?如果您真的只想根据某些条件进行过滤,您也可以在不使用 pandas 的情况下遍历整个文件
  • 4GB 或 RAM。我知道,是时候更新了。

标签: python pandas


【解决方案1】:

你的逻辑有问题,我们想遍历数据中的每个块,而不是数据本身。

“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)

你需要考虑如何处理你的标题!

【讨论】:

  • 感谢您的回答。但我仍然对read_csv() 中的参数iterator 感到困惑。设置iterator=True 有什么不同吗?谢谢
  • yes - 如果你有iterator = False(默认),你会得到一个数据框,设置为true,你会得到一个对象,你可以把数据框的每个chunk size 取出的。
【解决方案2】:

当您传递 chunksizeiterator=True 时,pd.read_table 会返回一个 TextFileReader,您可以对其进行迭代或调用 get_chunk。所以你需要在data 上迭代或调用get_chunk

所以正确处理整个文件可能看起来像

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)

【讨论】:

    猜你喜欢
    • 2018-06-08
    • 2016-02-12
    • 2021-05-13
    • 2017-12-01
    • 2015-10-28
    • 1970-01-01
    • 2011-03-21
    • 2021-10-17
    • 1970-01-01
    相关资源
    最近更新 更多