使用多重处理对同一数据框进行几次采样并返回几个采样的数据框

时间:2019-06-27 21:57:31

标签: python pandas multiprocessing

我对多重处理非常陌生,但是发现自己需要使用它来对同一只熊猫DataFrame进行几十次采样,但是我遇到了一些问题。

1)到目前为止,我已经尝试尝试以某种方式存储结果(即使我知道将它们保存在列表中并没有100%的意义):

import multiprocessing as mp
pool= mp.Pool(mp.cpu_count())

results = [[]]

for m in [1,2,3,4]:
    uni1 = pool.apply_async(temporary.groupby(['Customer_id','Day','Hour']).apply(lambda x: x.sample(n=1, random_state= m))['Timestamp'], callback= results)

pool.close()
pool.join()

但是当我回叫结果时,我得到一个空列表。我不知道是否有更好的存储方式...

2)我也尝试过

for m in [1,2,3,4]:
    uni1 = pool.apply_async(temporary.groupby(['Customer_id','Day','Hour']).apply(
    lambda x: x.sample(n=1, random_state= m ))['Timestamp'])

但是当我可以uni1回来时,它又返回了我,我不知道该如何转换为(这种情况)4个不同的数据框或其他我可以使用的东西

最后,我需要一个包含许多不同可用DataFrame的管道,然后可以使用它们应用不同的完成方法,并通过取所有DataFrame错误的平均值来研究最佳方法。但这当然意味着我必须能够处理这个采样函数的输出,而我只是做得不好。如果有人可以帮助我,我将非常感激!

1 个答案:

答案 0 :(得分:1)

对于您的用例,我有些困惑,但是下面的方法会起作用吗?它使用map而不是apply_async。

def helper(variables):
    grouped, m = variables[0], variables[1]
    return grouped.apply(lambda x: x.sample(n=1, random_state=m))['Timestamp']


if __name__ == '__main__':

    from multiprocessing import Pool

    grouped = df.groupby(['Customer_id', 'Day', 'Hour'])
    p = Pool(4)
    variables = [[grouped, m] for m in [1,2,3,4]]

    results = p.map(helper, variables)

    print results

结果是数据帧列表。