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
Lepaskan: 2024-12-13 02:56:09
asal
779 orang telah melayarinya

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)  
Salin selepas log masuk

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]]]))
    Salin selepas log masuk
  • 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)]))
    Salin selepas log masuk

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()]]))
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan