如何对数据框进行多进程操作

时间:2019-03-23 12:37:30

标签: python pandas multiprocessing

我必须在一个数据帧上执行很多操作,并且使用单个内核需要很长时间。我正在尝试实现多处理。

现在,当我试图弄清楚它是如何工作的时,我正在使用一个更简单的版本,我只想从数据中添加值

import multiprocessing
import pandas as pd

def add_values(a):
    df = pd.DataFrame([{'n':a}])
    return df

df = pd.DataFrame([{'n':0}])
data = [9, 4, 5]
with multiprocessing.Pool(processes=4) as pool:
    df = df.add(pool.map(add_values, data))

df

我希望df返回n = 18的数据帧,但我收到此错误消息ValueError:无法强制转换为Series,长度必须为1:给定3

1 个答案:

答案 0 :(得分:0)

这里的问题是如何处理多重处理调用的返回值。 pool.map()返回list。在这种情况下,它将是一个数据帧列表,即您的呼叫扩展到的内容等同于df = df.add([dfn9, dfn4, dfn5]),其中dfnX是不同的数据帧。

此输入既不期望也不能由df.add()处理,后者期望可以将某些内容转换为pd.Series对象并添加到原始帧中。相反,您需要获取此列表并“手动”减少它,例如为:

import multiprocessing
import pandas as pd

def add_values(a):
    df = pd.DataFrame([{'n':a}])
    return df

df = pd.DataFrame([{'n':0}])
data = [9, 4, 5]
with multiprocessing.Pool(processes=4) as pool:
    #df = df.add(pool.map(add_values, data)) does not work
    dfs = pool.map(add_values, data)

print(type(dfs))
# Reducing return values
for d in dfs:
    df = df.add(d)

print(df)

减少必须在单个过程中进行,因为不同的过程不会共享相同的df(相反,它们都具有相同的副本)。

作为旁注,我认为您也应该考虑使用multithreading,而不是multiprocessing。因为线程可以共享相同的内存并减少复制内存的需求,所以它可能更简单。另外,由于pandas减小了GIL,所以不会一次只能执行一个线程。