ホームページ >バックエンド開発 >Python チュートリアル >Pandas で CROSS JOIN を効率的に実行するにはどうすればよいですか?

Pandas で CROSS JOIN を効率的に実行するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-06 02:21:11337ブラウズ

How to Efficiently Perform a CROSS JOIN in Pandas?

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 のマージ操作については、次のトピックを参照してください:

  • [マージの基本](https://pbpython.com/pandas-merging-101-cheat-sheet.html)
  • [インデックスベース結合](https://pbpython.com/pandas-merging-101-join-indexes.html)
  • [複数の DataFrame への一般化](https://pbpython.com/pandas-merging-on- multiple-dataframes.html)

以上がPandas で CROSS JOIN を効率的に実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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