ホームページ >バックエンド開発 >Python チュートリアル >Pandas でデカルト積 (CROSS JOIN) を効率的に実行するにはどうすればよいですか?
Pandas の効率的なデカルト積 (CROSS JOIN)
概要:
デカルト積、 CROSS JOIN とも呼ばれる、データ分析の基本的な操作です。パンダでは、ある DataFrame のすべての行と別の DataFrame のすべての行を結合する必要があります。理解するのは簡単ですが、デカルト積を直接計算することは、特に大規模なデータセットの場合、計算コストが高くなる可能性があります。
ベスト プラクティス:
1. 「キー」列メソッド:
このアプローチは、小規模から中規模のデータセットに適しています:
def cartesian_product_key(left, right): return left.assign(key=1).merge(right.assign(key=1), on='key').drop('key', 1)
2. 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)
3.一意および非一意のインデックスに対する一般化された CROSS JOIN:
このメソッドは、あらゆる種類のインデックスを持つ DataFrame を処理できます:
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]]]))
4。 Multi-DataFrame CROSS JOIN:
これは、複数の 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)]))
5。 2 つの DataFrame の単純化された CROSS JOIN:
このメソッドは、@senderle の cartesian_product とほぼ同じ速度で、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 ベースのソリューションが、大規模なデータセットに対して他のソリューションよりも一貫して優れていることがわかります。
結論:
デカルト積を計算するための適切なメソッドの選択pandas はデータセットのサイズと特性によって異なります。パフォーマンスを優先する場合は、NumPy ベースのソリューションのいずれかを選択してください。利便性と柔軟性を高めるために、「キー」列メソッドまたは一般化された CROSS JOIN を検討してください。
以上がPandas でデカルト積 (CROSS JOIN) を効率的に実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。