Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimanakah Saya Boleh Melaksanakan Produk Cartesian (CROSS JOIN) dengan Cekap dalam Panda?

Bagaimanakah Saya Boleh Melaksanakan Produk Cartesian (CROSS JOIN) dengan Cekap dalam Panda?

Susan Sarandon
Susan Sarandonasal
2024-12-09 04:07:13786semak imbas

How Can I Efficiently Perform a Cartesian Product (CROSS JOIN) in Pandas?

Produk Cartesian Cekap (CROSS JOIN) dalam Panda

Pengenalan:

Produk Cartesian, juga dikenali sebagai CROSS JOIN, adalah operasi asas dalam analisis data. Dalam panda, ia melibatkan penggabungan setiap baris satu DataFrame dengan setiap baris yang lain. Walaupun mudah difahami, pengiraan produk Cartesian secara langsung boleh menjadi mahal dari segi pengiraan, terutamanya untuk set data yang besar.

Amalan Terbaik:

1. Kaedah Lajur 'kunci':

Pendekatan ini berfungsi dengan baik untuk set data kecil hingga sederhana:

def cartesian_product_key(left, right):
    return left.assign(key=1).merge(right.assign(key=1), on='key').drop('key', 1)

2. Penyelesaian Berasaskan NumPy:

Untuk set data yang lebih besar, penyelesaian berasaskan NumPy menawarkan prestasi yang lebih baik:

import numpy as np

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)  

3. CROSS JOIN Umum untuk Indeks Unik dan Bukan Unik:

Kaedah ini boleh mengendalikan DataFrames dengan sebarang jenis indeks:

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

4. CROSS JOIN Multi-DataFrame:

Ini melanjutkan pendekatan sebelumnya untuk mengendalikan berbilang DataFrame:

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

5. CROSS JOIN yang Mudah untuk Dua DataFrames:

Kaedah ini, yang hampir sepantas cartesian_product @senderle, amat berkesan untuk dua DataFrames:

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 kaedah ini pada set data yang berbeza-beza saiz mendedahkan bahawa penyelesaian berasaskan NumPy secara konsisten mengatasi prestasi yang lain untuk set data yang besar.

Kesimpulan:

Memilih kaedah yang betul untuk mengira produk Cartesian dalam panda bergantung pada saiz dan ciri set data anda. Jika prestasi adalah keutamaan, pilih salah satu daripada penyelesaian berasaskan NumPy. Untuk kemudahan dan fleksibiliti, pertimbangkan kaedah lajur 'kunci' atau CROSS JOIN umum.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melaksanakan Produk Cartesian (CROSS JOIN) dengan Cekap dalam Panda?. 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