在 pandas 数据帧上并行调用函数

Posted

技术标签:

【中文标题】在 pandas 数据帧上并行调用函数【英文标题】:Calling functions on pandas dataframe parallely 【发布时间】:2020-10-26 13:54:29 【问题描述】:

我有一个 2 亿条记录文件,正在使用 pandas read_csv 以 10000 的块大小读取该文件。这些数据帧正在被转换为一个列表对象,并且这个列表对象被传递给一个函数。

file_name=str(sys.argv[2])
df=pd.read_csv(file_name, na_filter=False, chunksize=10000)
for data in df:
    d=data.values.tolist()
    load_data(d)

有没有什么办法可以并行调用load_data函数,让10000多条记录同时传给函数?

我尝试使用以下问题中提到的解决方案:

    Python iterating over a list in parallel? How to run functions in parallel?

但是这些对我不起作用,因为我需要在调用函数之前先将数据框转换为列表对象。

我们将不胜感激。

【问题讨论】:

【参考方案1】:

是的,dask 很擅长这个

试试

import dask.dataframe as dd

dx = dd.read_csv(file_name, na_filter=False)

ans_delayed = dx.apply(my_function, meta='the return type')

ans = ans_delayed.compute()

如果你真的需要数据作为列表,你可以试试

import dask.bag as db

genrator = pd.read_csv(file_name, na_filter=False, chunksize=10000)

ans = db.from_sequence(generator).map(lambda df: 
load_data(df.values.tolist())).compute()

【讨论】:

你能用 dask 比 pandas 显示时间改进吗?

以上是关于在 pandas 数据帧上并行调用函数的主要内容,如果未能解决你的问题,请参考以下文章

为啥 numpy 函数在 pandas 系列/数据帧上这么慢?

在每一行数据帧上调用类似应用的函数,每行有多个参数

在具有多个参数的 pandas 数据帧上应用滚动函数

如何在聚合的 pandas 数据帧上运行多个函数

dask分布式数据帧上的慢len函数

并行化 pandas pyodbc SQL 数据库调用