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
Freigeben: 2024-12-07 17:46:13
Original
633 Leute haben es durchsucht

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]})
Nach dem Login kopieren

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
Nach dem Login kopieren

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)
Nach dem Login kopieren

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)  
Nach dem Login kopieren

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]]]))
Nach dem Login kopieren

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()]]))
Nach dem Login kopieren

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)
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage