Performantes kartesisches Produkt (CROSS JOIN) mit Pandas
In Pandas kann die Berechnung des kartesischen Produkts (Cross Join) zweier DataFrames ein sein wesentliche Operation. Während der Viele-zu-Viele-JOIN-Trick für kleinere DataFrames einigermaßen funktioniert, nimmt die Leistung bei größeren Daten ab.
Schnelle Implementierung mit NumPy
Eine schnellere Implementierung nutzt NumPy für 1D Kartesische Produktberechnungen:
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)
Verallgemeinerte Lösungen für verschiedene DataFrames
Der obige Trick funktioniert für DataFrames mit nicht gemischten Skalar-D-Typen. Bei gemischten D-Typen erfolgt die Verwendung auf eigenes Risiko.
Verallgemeinerung auf eindeutige indizierte Datenrahmen:
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]]]))
Mehrere DataFrames:
Mehrere DataFrames können kombiniert werden mit:
def cartesian_product_multi(*dfs): idx = cartesian_product(*[np.ogrid[:len(df)] for df in dfs]) return pd.DataFrame( np.column_stack([df.values[idx[:,i]] for i,df in enumerate(dfs)]))
Vereinfachte Lösung für zwei DataFrames
Beim Umgang mit nur zwei DataFrames a Es kann ein einfacherer Ansatz verwendet werden:
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 der Lösungen ergab, dass das NumPy-basierte kartesische Produkt_generalized am schnellsten ist, gefolgt von kartesischem Produkt_simplified für zwei DataFrames.
Das obige ist der detaillierte Inhalt vonWie kann ich ein kartesisches Produkt (Cross Join) von Pandas DataFrames effizient durchführen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!