Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimanakah Saya Boleh Melaksanakan Produk Cartesian (Cross Join) Pandas DataFrames dengan Cekap?

Bagaimanakah Saya Boleh Melaksanakan Produk Cartesian (Cross Join) Pandas DataFrames dengan Cekap?

Barbara Streisand
Barbara Streisandasal
2024-12-13 02:56:09785semak imbas

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

Produk Cartesian Berprestasi (CROSS JOIN) dengan Panda

Dalam Panda, pengiraan produk cartesian (sambung silang) dua DataFrames boleh menjadi operasi penting. Walaupun helah JOIN banyak-ke-banyak berfungsi dengan munasabah untuk DataFrames yang lebih kecil, prestasi menurun dengan data yang lebih besar.

Pelaksanaan Pantas Menggunakan NumPy

Pelaksanaan yang lebih pantas menggunakan NumPy untuk 1D produk cartesian pengiraan:

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)  

Penyelesaian Umum untuk DataFrames Berbeza

Helah di atas berfungsi untuk DataFrames dengan djenis skalar bukan campuran. Untuk djenis bercampur, gunakan atas risiko anda sendiri.

  • Mengerti kepada Bingkai Data Berindeks Unik:

    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]]]))
  • Pengendalian Indeks Bukan Unik:
    Penyelesaian di atas boleh dilanjutkan untuk berfungsi dengan indeks bukan unik.
  • Berbilang DataFrames:
    Berbilang DataFrames boleh digabungkan menggunakan:

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

Penyelesaian Ringkas untuk Dua DataFrames

Apabila berurusan dengan hanya dua DataFrames, pendekatan yang lebih mudah boleh digunakan:

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

Perbandingan Prestasi

Menanda aras penyelesaian menunjukkan bahawa cartesian_product_generalized berasaskan NumPy adalah yang terpantas, diikuti oleh cartesian_product_simplified untuk dua DataFrames.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melaksanakan Produk Cartesian (Cross Join) Pandas DataFrames dengan Cekap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn