私は各列にSciPyスパースベクトルを含む2つの列を持つパンダデータフレームを持っています。これらのベクトルはcsr行列からの行です(実際には1x8500の行列です)。スパースベクトルで2つのパンダ列の各行間のドット積を計算する方法
同じ行の最初の2つの列からのベクトルの間にドット積を入れるべき別の列を作成する必要があります。
私はapply
/map
の各行でこれを行う方法を知っていますが、私は何百万行ものデータセットで作業しています。データフレーム全体でこれを行うもっと速い方法がありますか?
ドットプロダクト以外にも、コサイン類似度を計算する必要がありますが、これはドットプロダクトから私が理解する限り得ることができます。
アップデート:私はここに実際のデータを共有することはできませんが、ここでおもちゃの例は、(私は今の結果のデータフレームを持っていることに注意してください)です。
import pandas as pd
import numpy as np
from scipy.sparse import csr_matrix
row = np.array([0, 0, 1, 2, 2, 2])
col = np.array([0, 2, 2, 0, 1, 2])
data = np.array([1, 2, 3, 4, 5, 6])
mat = csr_matrix((data, (row, col)), shape=(3, 3))
df = pd.DataFrame({'Col_1': [mat.getrow(i) for i in range(3)],
'Col_2': [mat.getrow(i)*2 for i in range(3)]})
私は計算にこのような何かを行うことができます知っていますドットプロダクト:
df['Col_3'] = df.apply(lambda row: np.dot(row['Col_1'],
row['Col_2'].transpose()).toarray()[0][0], axis=1)
しかし、Col_3
を計算する効率的な方法はありますか?あなたの例で
小さな再現性のあるサンプルデータセットと目的のデータセットを提供できますか? – MaxU
あなたのデータフレーム内のアイテムは本当にまばらなベクトルですか?何かが、最適ではないデザインだと私に伝えます。パンダを実際に写真に持っていく必要がありますか? –
あなたのデータセットはどれくらいの大きさですか? –