Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk Cekap Melakukan CROSS JOIN dalam Panda?

Bagaimana untuk Cekap Melakukan CROSS JOIN dalam Panda?

Barbara Streisand
Barbara Streisandasal
2024-12-06 02:21:11373semak imbas

How to Efficiently Perform a CROSS JOIN in Pandas?

Performant Cross Join (CROSS JOIN) dengan Panda

Dalam siaran ini, kami meneroka kaedah yang paling berkesan untuk melaksanakan produk Cartesian (CROSS SERTAI) operasi dalam Panda.

Kaedah Dasar: Kunci Sementara Lajur

Pendekatan biasa melibatkan penugasan lajur kunci sementara kepada kedua-dua DataFrames, melakukan gabungan banyak-ke-banyak pada kunci itu, dan kemudian melepaskan lajur kunci:

left = pd.DataFrame({'col1' : ['A', 'B', 'C'], 'col2' : [1, 2, 3]})
right = pd.DataFrame({'col1' : ['X', 'Y', 'Z'], 'col2' : [20, 30, 50]})

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

cartesian_product_basic(left, right)

Pelaksanaan Berasaskan NumPy

Untuk prestasi yang lebih baik pada set data yang lebih besar, kami memanfaatkan pelaksanaan NumPy bagi produk Cartesian:

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)  

Generalisasi kepada Bingkai Data Berindeks Bukan Unik

Kami boleh melanjutkan pendekatan ini untuk mengendalikan DataFrames dengan indeks bukan 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]]]))

Pelaksanaan Dipermudahkan untuk Dua DataFrames

Apabila berurusan dengan hanya dua DataFrames, teknik yang lebih mudah menggunakan np.broadcast_arrays boleh mencapai prestasi yang setanding:

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 mendedahkan bahawa pelaksanaan berasaskan NumPy menyediakan prestasi terpantas, terutamanya untuk set data yang lebih besar:

[Imej carta perbandingan prestasi]

Bacaan Lanjut

Untuk menyelam lebih mendalam mengenai operasi penggabungan Panda, teroka topik berikut:

  • [Penggabungan asas](https://pbpython.com/pandas-merging-101-cheat-sheet.html)
  • [Index-based joins](https://pbpython.com/pandas-merging-101- join-indexes.html)
  • [Mengerti kepada berbilang DataFrames](https://pbpython.com/pandas-merging-on-multiple-dataframes.html)

Atas ialah kandungan terperinci Bagaimana untuk Cekap Melakukan CROSS JOIN 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