Heim >Backend-Entwicklung >Python-Tutorial >Wie führt man einen CROSS JOIN in Pandas effizient durch?

Wie führt man einen CROSS JOIN in Pandas effizient durch?

Barbara Streisand
Barbara StreisandOriginal
2024-12-06 02:21:11330Durchsuche

How to Efficiently Perform a CROSS JOIN in Pandas?

Performant Cross Join (CROSS JOIN) mit Pandas

In diesem Beitrag untersuchen wir die effizientesten Methoden zur Durchführung eines kartesischen Produkts (CROSS). JOIN)-Vorgang in Pandas.

Basismethode: Temporärer Schlüssel Spalte

Der typische Ansatz besteht darin, beiden DataFrames eine temporäre Schlüsselspalte zuzuweisen, eine Viele-zu-Viele-Verknüpfung für diesen Schlüssel durchzuführen und dann die Schlüsselspalte zu löschen:

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-basierte Implementierung

Für eine verbesserte Leistung bei größeren Datensätzen nutzen wir die NumPy-Implementierung von Kartesisches Produkt:

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)  

Verallgemeinerung auf nicht eindeutige indizierte DataFrames

Wir können diesen Ansatz erweitern, um DataFrames mit nicht eindeutigen Indizes zu verarbeiten:

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]]]))

Vereinfachte Umsetzung für Zwei DataFrames

Beim Umgang mit nur zwei DataFrames kann eine einfachere Technik unter Verwendung von np.broadcast_arrays eine vergleichbare Leistung erzielen:

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()]]))

Leistungsvergleich

Das Benchmarking dieser Methoden zeigt, dass die NumPy-basierten Implementierungen die schnellste Leistung bieten, insbesondere bei größeren Datensätze:

[Bild der Leistungsvergleichstabelle]

Weiterführende Literatur

Um einen tieferen Einblick in die Zusammenführungsvorgänge von Pandas zu erhalten, erkunden Sie die folgenden Themen:

  • [Zusammenführen Grundlagen](https://pbpython.com/pandas-merging-101-cheat-sheet.html)
  • [Indexbasierte Verknüpfungen](https://pbpython.com/pandas-merging-101- join-indexes.html)
  • [Verallgemeinerung auf mehrere DataFrames](https://pbpython.com/pandas-merging-on-multiple-dataframes.html)

Das obige ist der detaillierte Inhalt vonWie führt man einen CROSS JOIN in Pandas effizient durch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn