python - 如何在 python 中流入和操作大数据文件

标签 python pandas dataframe python-itertools

我有一个相对较大 (1 GB) 的文本文件,我想通过跨类别求和来减小它的大小:

Geography AgeGroup Gender Race Count
County1   1        M      1    12
County1   2        M      1    3
County1   2        M      2    0

收件人:

Geography Count
County1   15
County2   23

如果整个文件可以放入内存但使用 pandas.read_csv() 会出现 MemoryError,这将是一件简单的事情。所以我一直在研究其他方法,似乎有很多选择——HDF5?使用 itertools(这看起来很复杂 - 生成器?)或者只是使用标准文件方法读取第一个地理区域(70 行),对计数列求和,然后在加载另外 70 行之前写出。

有人对执行此操作的最佳方法有任何建议吗?我特别喜欢流式传输数据的想法,尤其是因为我可以想到很多其他有用的地方。我对这种方法或类似地使用可能的最基本功能的方法最感兴趣。

编辑:在这个小案例中,我只想要按地理位置统计的总和。但是,如果我可以读入一个 block ,指定任何函数(比如,将 2 列加在一起,或者按地理位置取一列的最大值),应用函数,并在读入新 block 之前写入输出,那将是理想的.

最佳答案

您可以使用 dask.dataframe ,它在语法上类似于 pandas,但在核外执行操作,因此内存应该不是问题:

import dask.dataframe as dd

df = dd.read_csv('my_file.csv')
df = df.groupby('Geography')['Count'].sum().to_frame()
df.to_csv('my_output.csv')

或者,如果 pandas 是必需的,您可以使用分 block 读取,如@chrisaycock 所述。您可能想尝试使用 chunksize 参数。

# Operate on chunks.
data = []
for chunk in pd.read_csv('my_file.csv', chunksize=10**5):
    chunk = chunk.groupby('Geography', as_index=False)['Count'].sum()
    data.append(chunk)

# Combine the chunked data.
df = pd.concat(data, ignore_index=True)
df = df.groupby('Geography')['Count'].sum().to_frame()
df.to_csv('my_output.csv')

关于python - 如何在 python 中流入和操作大数据文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38208389/

相关文章:

r - Data.Frame 中每一行的随机列样本

python - 在 Pandas 数据框中的每一行中找到非零值的列索引集

python - 如何根据原始数据帧组合和过滤最终数据帧?

python - 当 x 轴和 y 轴为文本时注释数据点 matplotlib

Python pandas 在滚动日期窗口中最常见的值

python - 使用 itertuples 遍历 pandas dataframe

python - pandas 系列元素明智乘法

Python - 获取 Pandas 的 Apply 函数上的值的索引

python - Pyodbc - 在表内加载数据导致错误

python - Pandas:根据条件获取多列