首頁 > 後端開發 > Python教學 > 如何在 Pandas 中有效率地執行 CROSS JOIN?

如何在 Pandas 中有效率地執行 CROSS JOIN?

Barbara Streisand
發布: 2024-12-06 02:21:11
原創
329 人瀏覽過

How to Efficiently Perform a CROSS JOIN in Pandas?

使用Pandas 進行高效能交叉連結(CROSS JOIN)

在這篇文章中,我們探討執行笛卡爾積(CROSS JOIN ) 最有效的方法Pandas 中的JOIN) 操作。

基線方法:臨時鍵列

典型的方法包括為兩個DataFrame 分配一個臨時鍵列,對該鍵執行多對多連接,然後刪除該鍵列:

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)
登入後複製

基於NumPy的實作

提高更大的效能資料集,我們利用 NumPy的笛卡爾積實現:

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)  
登入後複製

泛化到非唯一索引資料幀

我們可以擴展這種方法來處理非唯一索引資料幀唯一索引:

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]]]))
登入後複製

簡化實作對於兩個DataFrames

只處理兩個DataFrame 時,利用np.broadcast_arrays 的更簡單技巧可以實現相當的效能:

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()]]))
登入後複製

效能比較

效能比較

效能比較

效能比較
  • 效能比較
效能比較>對這些方法進行基準測試表明,基於NumPy的實現提供了最快的性能,特別是對於較大的數據集:[性能比較圖圖像]進一步閱讀要深入了解Pandas合併操作,請探討以下內容主題:[合併基礎](https://pbpython.com/pandas-merging-101-cheat-sheet.html) [索引為基礎的連結](https://pbpython.com/pandas-merging-101- join-indexes.html)[推廣到多個資料幀](https://pbpython.com/pandas-merging-on-multiple-dataframes.html)

以上是如何在 Pandas 中有效率地執行 CROSS JOIN?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板