Heim > Backend-Entwicklung > Python-Tutorial > Wie kann ich ein kartesisches Produkt (Cross Join) von Pandas DataFrames effizient durchführen?

Wie kann ich ein kartesisches Produkt (Cross Join) von Pandas DataFrames effizient durchführen?

Barbara Streisand
Freigeben: 2024-12-13 02:56:09
Original
779 Leute haben es durchsucht

How Can I Efficiently Perform a Cartesian Product (Cross Join) of Pandas DataFrames?

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

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]]]))
    Nach dem Login kopieren
  • Handhabung Nicht-eindeutige Indizes:
    Die obige Lösung kann erweitert werden, um mit nicht-eindeutigen Indizes zu arbeiten Indizes.
  • 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)]))
    Nach dem Login kopieren

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

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!

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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage