微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

熊猫分组后并行应用

如何解决熊猫分组后并行应用

尽管确实应该将其内置到熊猫中,但这似乎可行

import pandas as pd
from joblib import Parallel, delayed
import multiprocessing

def tmpFunc(df):
    df['c'] = df.a + df.b
    return df

def applyParallel(dfGrouped, func):
    retLst = Parallel(n_jobs=multiprocessing.cpu_count())(delayed(func)(group) for name, group in dfGrouped)
    return pd.concat(retLst)

if __name__ == '__main__':
    df = pd.DataFrame({'a': [6, 2, 2], 'b': [4, 5, 6]},index= ['g1', 'g1', 'g2'])
    print 'parallel version: '
    print applyParallel(df.groupby(df.index), tmpFunc)

    print 'regular version: '
    print df.groupby(df.index).apply(tmpFunc)

    print 'ideal version (does not work): '
    print df.groupby(df.index).applyParallel(tmpFunc)

解决方法

我曾经在之后rosetta.parallel.pandas_easy进行并行化,例如:apply``groupby

from rosetta.parallel.pandas_easy import groupby_to_series_to_frame
df = pd.DataFrame({'a': [6,2,2],'b': [4,5,6]},index= ['g1','g1','g2'])
groupby_to_series_to_frame(df,np.mean,n_jobs=8,use_apply=True,by=df.index)

但是,有没有人想出如何并行化返回DataFrame的函数?rosetta如预期,此代码对于失败。

def tmpFunc(df):
    df['c'] = df.a + df.b
    return df

df.groupby(df.index).apply(tmpFunc)
groupby_to_series_to_frame(df,tmpFunc,n_jobs=1,by=df.index)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。