ホームページ >バックエンド開発 >Python チュートリアル >Pandas で CROSS JOIN を効率的に実行するにはどうすればよいですか?
Pandas を使用したパフォーマンスクロス結合 (CROSS JOIN)
この投稿では、デカルト積 (CROSS) を実行するための最も効率的な方法を検討します。 Pandas での JOIN) 操作。
ベースライン メソッド:一時キー列
一般的なアプローチでは、一時キー列を両方の DataFrame に割り当て、そのキーに対して多対多結合を実行して、キー列を削除します。
left = pd.DataFrame({'col1' : ['A', 'B', 'C'], 'col2' : [1, 2, 3]}) right = pd.DataFrame({'col1' : ['X', 'Y', 'Z'], 'col2' : [20, 30, 50]}) def cartesian_product_basic(left, right): return ( left.assign(key=1).merge(right.assign(key=1), on='key').drop('key', 1)) cartesian_product_basic(left, right)
NumPy ベースの実装
大規模な環境でのパフォーマンス向上のためデータセットの場合、NumPy のデカルト積の実装を活用します。
import numpy as np def cartesian_product(*arrays): la = len(arrays) dtype = np.result_type(*arrays) arr = np.empty([len(a) for a in arrays] + [la], dtype=dtype) for i, a in enumerate(np.ix_(*arrays)): arr[...,i] = a return arr.reshape(-1, la)
非一意のインデックス付きデータフレームへの一般化
このアプローチを拡張して、非固有のインデックス付きデータフレームを処理できます。個性的インデックス:
def cartesian_product_generalized(left, right): la, lb = len(left), len(right) idx = cartesian_product(np.ogrid[:la], np.ogrid[:lb]) return pd.DataFrame( np.column_stack([left.values[idx[:,0]], right.values[idx[:,1]]]))
2 つの DataFrame の簡略化された実装
2 つの DataFrame のみを扱う場合、np.broadcast_arrays を利用したより単純な手法で同等のパフォーマンスを達成できます。
def cartesian_product_simplified(left, right): la, lb = len(left), len(right) ia2, ib2 = np.broadcast_arrays(*np.ogrid[:la,:lb]) return pd.DataFrame( np.column_stack([left.values[ia2.ravel()], right.values[ib2.ravel()]]))
パフォーマンス比較
これらのメソッドのベンチマークを行うと、NumPy ベースの実装が、特に大規模なデータセットに対して最速のパフォーマンスを提供することがわかります。
[パフォーマンス比較チャートの画像]
さらに読む
さらに詳しく読むにはPandas のマージ操作については、次のトピックを参照してください:
以上がPandas で CROSS JOIN を効率的に実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。