如何将超大数据集处理成Python(Pandas)的chunk,同时考虑全数据集来应用函数?

How to processes the extremely large dataset into chunks in Python (Pandas), while considering the full dataset for application of function?

我在论坛上阅读了很多关于类似主题的帖子。但是,我相信我在这里问的不是重复问题。

我正在阅读 very large dataset (22 gb) of CSV format, having 350 million rows. I am trying to read the dataset in chunks, based on the solution provided by that link.

我目前的代码如下。

import pandas as pd

def Group_ID_Company(chunk_of_dataset):
    return chunk_of_dataset.groupby(['id', 'company'])[['purchasequantity', 'purchaseamount']].sum()

chunk_size = 9000000
chunk_skip = 1

transactions_dataset_DF = pd.read_csv('transactions.csv', skiprows = range(1, chunk_skip), nrows = chunk_size)
Group_ID_Company(transactions_dataset_DF.reset_index()).to_csv('Group_ID_Company.csv')

for i in range(0, 38):
    chunk_skip += chunk_size;
    transactions_dataset_DF = pd.read_csv('transactions.csv', skiprows = range(1, chunk_skip), nrows = chunk_size)
    Group_ID_Company(transactions_dataset_DF.reset_index()).to_csv('Group_ID_Company.csv', mode = 'a', header = False)

代码没有问题,运行没问题。但是,它 groupby(['id', 'company'])[['purchasequantity', 'purchaseamount']].sum() 只有 运行 9000000 行,声明为 chunk_size。然而,我需要 运行 整个数据集的声明,而不是逐块。

原因是,当它是 运行 一个块一个块地处理时,只有一个块得到处理,但是,还有很多其他行分散在整个数据集中并被留在另一个块中大块。

一个可能的解决方案是在新生成的“Group_ID_Company.csv”上再次运行代码。通过这样做,代码将再次遍历新数据集和 sum() 所需的列。但是,我在想可能有另一种(更好的)方法来实现这一点。

您的问题的解决方案可能是 Dask. You may watch the introductory video, read examples and try them online in a live session(在 JupyterLab 中)。

MarianD 的回答表格非常完美,我在这里回答分享解决方案代码。

此外,DASK 能够平等地利用所有核心,而 Pandas 仅使用一个核心达到 100%。所以,这是 DASK 的另一个好处,我注意到 Pandas。

import dask.dataframe as dd

transactions_dataset_DF = dd.read_csv('transactions.csv')
Group_ID_Company_DF = transactions_dataset_DF.groupby(['id', 'company'])[['purchasequantity', 'purchaseamount']].sum().compute()
Group_ID_Company_DF.to_csv('Group_ID_Company.csv')

# to clear the memory
transactions_dataset_DF = None
Group_ID_Company_DF = None

DASK 已经能够一次读取所有 3.5 亿行(20 GB 的数据集)。这是以前 Pandas 没有实现的,我必须创建 37 个块来处理整个数据集,并且使用 Pandas.

完成处理花了将近 2 个小时

然而,使用 DASK,(一次)读取、处理然后保存新数据集只需要大约 20 分钟。