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
あなたが何をしても、かなりの時間がかかります。 「私のデータフレームには約4億行があります」と言うと、速度のためにnumbaや関連ライブラリに行く必要があります。応募はお勧めできません。 – Dark
これはボトルネックなので、ベクトル化された操作を扱うことができる別の 'jaccard'関数を見つけるほうがよいでしょう。 –
@msksanthoshデータフレームのサンプルを置くと、何か良いものが出てくるでしょう。あなたのデータサンプルに対して私たちのソリューションを試さずに何かを提案することができます。 – Dark