ホームページ >バックエンド開発 >Python チュートリアル >Pandas DataFrame のデカルト積 (相互結合) を効率的に実行するにはどうすればよいですか?
Pandas を使用したパフォーマンス デカルト積 (CROSS JOIN)
Pandas では、2 つの DataFrame のデカルト積 (クロス結合) を計算することができます。重要な操作。多対多の JOIN トリックは小さい DataFrame では適切に機能しますが、データが大きくなるとパフォーマンスが低下します。
NumPy を使用した高速実装
より高速な実装では、1D に NumPy を利用します。デカルト積計算:
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)
さまざまな DataFrame に対する一般化されたソリューション
上記のトリックは、非混合スカラー dtype を持つ DataFrame に対して機能します。混合 dtype の場合は、ご自身の責任で使用してください。
一意のインデックス付きデータフレームへの一般化:
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]]]))
複数の DataFrame:
複数の DataFrame は、
def cartesian_product_multi(*dfs): idx = cartesian_product(*[np.ogrid[:len(df)] for df in dfs]) return pd.DataFrame( np.column_stack([df.values[idx[:,i]] for i,df in enumerate(dfs)]))
2 人向けのシンプルなソリューションDataFrames
2 つの DataFrame だけを扱う場合は、より単純なアプローチを使用できます。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 ベースの cartesian_product_generalized が最も高速で、次に続くことがわかりました。 2 つの DataFrame の cartesian_product_simplified。以上がPandas DataFrame のデカルト積 (相互結合) を効率的に実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。