본문 바로가기
파이썬

파이썬 팬더 그룹 후 적용 병렬화

by º기록 2020. 12. 6.
반응형

groupby 이후에 apply 를 병렬화하기 위해 rosetta.parallel.pandas_easy 를 사용했습니다. 예를 들면 다음과 같습니다.

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, use_apply=True, by=df.index)

 

해결 방법

 

실제로 팬더에 내장되어야하지만 작동하는 것 같습니다.

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)

 

참조 페이지 https://stackoverflow.com/questions/26187759

 

 

반응형

댓글