Heim >Backend-Entwicklung >Python-Tutorial >Wie kann man mit Pandas DataFrames effizient ein kartesisches Produkt (CROSS JOIN) durchführen?

Wie kann man mit Pandas DataFrames effizient ein kartesisches Produkt (CROSS JOIN) durchführen?

DDD
DDDOriginal
2024-12-07 17:46:13671Durchsuche

How to Efficiently Perform a Cartesian Product (CROSS JOIN) with Pandas DataFrames?

Performantes kartesisches Produkt (CROSS JOIN) mit Pandas

Im Bereich der Datenmanipulation ist das kartesische Produkt oder CROSS JOIN eine wertvolle Operation, die zwei oder kombiniert mehr DataFrames auf einer Eins-zu-Eins- oder Viele-zu-Viele-Basis. Dieser Vorgang erweitert den ursprünglichen Datensatz, indem neue Zeilen für alle möglichen Kombinationen von Elementen aus den Eingabe-DataFrames erstellt werden.

Problemstellung

Gegeben sind zwei DataFrames mit eindeutigen Indizes:

left = pd.DataFrame({'col1': ['A', 'B', 'C'], 'col2': [1, 2, 3]})
right = pd.DataFrame({'col1': ['X', 'Y', 'Z'], 'col2': [20, 30, 50]})

Das Ziel besteht darin, die effizienteste Methode zur Berechnung des kartesischen Produkts dieser DataFrames zu finden, was zu Folgendem führt Ausgabe:

  col1_x  col2_x col1_y  col2_y
0      A       1      X      20
1      A       1      Y      30
2      A       1      Z      50
3      B       2      X      20
4      B       2      Y      30
5      B       2      Z      50
6      C       3      X      20
7      C       3      Y      30
8      C       3      Z      50

Optimale Lösungen

Methode 1: Temporäre Schlüsselspalte

Ein Ansatz besteht darin, vorübergehend eine „Schlüssel“-Spalte mit a zuzuweisen gemeinsamer Wert für beide DataFrames:

left.assign(key=1).merge(right.assign(key=1), on='key').drop('key', 1)

Diese Methode verwendet Zusammenführung, um einen Viele-zu-Viele-JOIN auf dem auszuführen Spalte „Schlüssel“.

Methode 2: Kartesisches Produkt von NumPy

Für größere DataFrames besteht eine leistungsfähige Lösung darin, die Implementierung des kartesischen Produkts von NumPy zu verwenden:

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)  

Diese Funktion generiert alle möglichen Kombinationen von Elementen aus der Eingabe Arrays.

Methode 3: Verallgemeinerter CROSS JOIN

Die verallgemeinerte Lösung funktioniert auf DataFrames mit nicht eindeutigen oder gemischten Indizes:

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

Dies Die Methode indiziert die DataFrames basierend auf dem kartesischen Produkt ihrer Indizes neu.

Erweitert Lösungen

Methode 4: Vereinfachter CROSS JOIN

Eine weitere vereinfachte Lösung ist für zwei DataFrames mit nicht gemischten D-Typen möglich:

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

Dies Die Methode verwendet Broadcasting und NumPys Ogrid, um das kartesische Produkt der DataFrames zu generieren. Indizes.

Leistungsvergleich

Die Leistung dieser Lösungen variiert je nach Größe und Komplexität des Datensatzes. Der folgende Benchmark bietet einen relativen Vergleich ihrer Ausführungszeit:

# ... (Benchmarking code not included here)

Die Ergebnisse zeigen, dass die NumPy-basierte Methode „cartesian_product“ in den meisten Fällen die anderen Lösungen übertrifft, insbesondere wenn die Größe der DataFrames zunimmt.

Fazit

Durch die Nutzung der vorgestellten Techniken können Datenanalysten effizient kartesische Produkte auf DataFrames durchführen, einer grundlegenden Operation zur Datenmanipulation und Erweiterung. Diese Methoden ermöglichen eine optimale Leistung auch bei großen oder komplexen Datensätzen und ermöglichen eine effiziente Datenexploration und -analyse.

Das obige ist der detaillierte Inhalt vonWie kann man mit Pandas DataFrames effizient ein kartesisches Produkt (CROSS JOIN) durchführen?. 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