ホームページ >バックエンド開発 >Python チュートリアル >Pandas DataFrame のデカルト積 (相互結合) を効率的に実行するにはどうすればよいですか?

Pandas DataFrame のデカルト積 (相互結合) を効率的に実行するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-13 02:56:09789ブラウズ

How Can I Efficiently Perform a Cartesian Product (Cross Join) of Pandas DataFrames?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。