2017-11-08 4 views
0

パンダのデータフレームの2つの列の間に関数(jaccard string distance)を適用して新しい列を作成しようとしています。私のデータフレームには約4億行があります。巨大なサイズのため大きなパンダのデータフレームに効率よく機能を適用する

df['sim_scr'] = df.apply(lambda x: jaccard(x[0],x[1],2),axis=1) 

は、それはかなりの時間がかかっているので、私はチャンクへのデータフレームは、関数を適用して戻ってそれらを結合分割しようとしました。これでも非常に時間がかかります:

for chunk in np.array_split(df,1000): 
chunk['sim_scr'] = chunk.apply(lambda x: jaccard(x[0],x[1],2),axis=1) 
df2 = df2.append(chunk) 

これを達成する効率的な方法はありますか?

EDIT:

def jaccard(a,b,n): 
s = [a[i:i+n] for i in range(len(a)-n+1)] 
t = [b[i:i+n] for i in range(len(b)-n+1)] 
if len(list(set(s) | set(t))) >0: 
    jac_coeff = 1 - len(list(set(s) & set(t)))/len(list(set(s) | set(t))) 
else: 
jac_coeff = 1 
return jac_coeff 

サンプルDATAFRAME:

これは私が私のジャカード距離関数定義された方法である私の理解で

nm1   nm2 
John A  Smith K 
California Cadifornia 
San Frans San Fransisco 
+0

あなたが何をしても、かなりの時間がかかります。 「私のデータフレームには約4億行があります」と言うと、速度のためにnumbaや関連ライブラリに行く必要があります。応募はお勧めできません。 – Dark

+0

これはボトルネックなので、ベクトル化された操作を扱うことができる別の 'jaccard'関数を見つけるほうがよいでしょう。 –

+0

@msksanthoshデータフレームのサンプルを置くと、何か良いものが出てくるでしょう。あなたのデータサンプルに対して私たちのソリューションを試さずに何かを提案することができます。 – Dark

答えて

0

を、ベクターでの操作が最も効果的です方法。大きなベクトルの行を分割して計算すると、合計が遅くなると思います。

分割してマージすると、大きなベクトルをコピー/マージするのに時間がかかるでしょう。

このようにして、2 dimベクトルn * 2をn/5 * 5 * 2のように3 dimに変換し、そのベクトルを処理できる別の関数またはlibを見つけます。

関連する問題