首頁 > 後端開發 > Python教學 > 如何在 Pandas 中高效率地執行笛卡爾積(CROSS JOIN)?

如何在 Pandas 中高效率地執行笛卡爾積(CROSS JOIN)?

Susan Sarandon
發布: 2024-12-09 04:07:13
原創
774 人瀏覽過

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

Pandas 中的高效笛卡爾積(CROSS JOIN)

簡介:

笛卡爾積,也稱為CROSS JOIN,是資料中的基本操作分析。在 pandas 中,它涉及將一個 DataFrame 的每一行與另一個 DataFrame 的每一行組合起來。雖然易於理解,但直接計算笛卡爾積的計算成本可能很高,尤其是對於大型資料集。

最佳實務:

1。 「關鍵」欄位方法:

此方法非常適合中小型資料集:

def cartesian_product_key(left, right):
    return left.assign(key=1).merge(right.assign(key=1), on='key').drop('key', 1)
登入後複製

2。基於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)  
登入後複製

3.唯一和非唯一索引的廣義交叉連接:

此方法可以處理具有任何類型索引的DataFrame:

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。多資料幀交叉連接:

這擴展了先前處理多個資料幀的方法:

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。兩個 DataFrame 的簡化 CROSS JOIN:

此方法幾乎與 @senderle 的 cartesian_product 一樣快,對於兩個 DataFrame特別有效:

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 中的笛卡爾積取決於資料集的大小和特徵。如果效能是優先考慮的因素,請選擇基於 NumPy 的解決方案之一。為了方便和靈活,請考慮「鍵」列方法或廣義的 CROSS JOIN。

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

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