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
Barbara StreisandOriginal
2024-12-13 02:56:09838Durchsuche

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)  

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

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!

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