5

パラレルプログラミングをしないで、keyカラムに左右のデータフレームをマージすることはできますが、両方とも非常に時間がかかります。効率的に並列化する方法はありますか?2台のパンダのデータフレームを並列にマージする方法(マルチスレッドまたはマルチプロセッシング)

私は64個のコアを持っていますので、実際には63個を使ってこれら2つのデータフレームをマージすることができます。

left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'], 
         'A': ['A0', 'A1', 'A2', 'A3'], 
        'B': ['B0', 'B1', 'B2', 'B3']}) 


right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'], 
         'C': ['C0', 'C1', 'C2', 'C3'], 
         'D': ['D0', 'D1', 'D2', 'D3']}) 


result = pd.merge(left, right, on='key') 

出力は次のようになります。

left: 
    A B key 
0 A0 B0 K0 
1 A1 B1 K1 
2 A2 B2 K2 
3 A3 B3 K3 

right: 
    C D key 
0 C0 D0 K0 
1 C1 D1 K1 
2 C2 D2 K2 
3 C3 D3 K3 

result: 
    A B key C D 
0 A0 B0 K0 C0 D0 
1 A1 B1 K1 C1 D1 
2 A2 B2 K2 C2 D2 
3 A3 B3 K3 C3 D3 

私はスピードでそれを行うことができるように並列にこれをやりたいです。

+0

「マルチスレッド」ソリューションが可能であっても、あなたは並行して、それらをマージし、チャンクにあなたのデータフレームを打破する必要があると思います(おそらく 'スレッドを使用して'モジュール)を作成し、チャンクをまとめて戻します。すべてがあなたのスピードを4倍以上に向上させるだけです(あなたには4つのコアがあります)。 –

+0

私は64コアを持っていますので、実際にはこれらの2つのデータフレームをマージするために63コアを使用できます。 – contactlp

答えて

3

key列をデータフレームのインデックスにし、代わりにjoinを使用すると、マージの速度を向上させることができます(この例で約3倍)。

left2 = left.set_index('key') 
right2 = right.set_index('key') 

In [46]: %timeit result2 = left2.join(right2) 
1000 loops, best of 3: 361 µs per loop 

In [47]: %timeit result = pd.merge(left, right, on='key') 
1000 loops, best of 3: 1.01 ms per loop 
+2

ありがとう、私もこれを組み込むが、私は64のコアを持って、私はそれらを利用したい。 – contactlp

5

私はあなたがdaskを使用できると信じています。 と機能merge

Docsは言う:

間違いなく動作しますか?

巧みに並列化操作(も速い):

インデックスに参加:dd.merge(DF1、DF2、left_index =真、right_index = true)を

または:

シャッフルが必要な操作

セットインデックス:df.set_index(df.x)

がインデックスにない参加:pd.merge(= '名前' に、DF1、DF2)

あなたがすることもできます方法を確認してくださいCreate Dask DataFrames

import pandas as pd 

left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'], 
         'A': ['A0', 'A1', 'A2', 'A3'], 
        'B': ['B0', 'B1', 'B2', 'B3']}) 


right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'], 
         'C': ['C0', 'C1', 'C2', 'C3'], 
         'D': ['D0', 'D1', 'D2', 'D3']}) 


result = pd.merge(left, right, on='key') 
print result 
    A B key C D 
0 A0 B0 K0 C0 D0 
1 A1 B1 K1 C1 D1 
2 A2 B2 K2 C2 D2 
3 A3 B3 K3 C3 D3 

import dask.dataframe as dd 

#Construct a dask objects from a pandas objects 
left1 = dd.from_pandas(left, npartitions=3) 
right1 = dd.from_pandas(right, npartitions=3) 

#merge on key 
print dd.merge(left1, right1, on='key').compute() 
    A B key C D 
0 A3 B3 K3 C3 D3 
1 A1 B1 K1 C1 D1 
0 A2 B2 K2 C2 D2 
1 A0 B0 K0 C0 D0 
#first set indexes and then merge by them 
print dd.merge(left1.set_index('key').compute(), 
       right1.set_index('key').compute(), 
       left_index=True, 
       right_index=True) 
     A B C D 
key     
K0 A0 B0 C0 D0 
K1 A1 B1 C1 D1 
K2 A2 B2 C2 D2 
K3 A3 B3 C3 D3 
関連する問題