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.
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
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.
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.
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.
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!