首頁 > 後端開發 > Python教學 > 如何有效執行 Pandas DataFrame 的笛卡爾積(交叉連接)?

如何有效執行 Pandas DataFrame 的笛卡爾積(交叉連接)?

Barbara Streisand
發布: 2024-12-13 02:56:09
原創
785 人瀏覽過

How Can I Efficiently Perform a Cartesian Product (Cross Join) of Pandas DataFrames?

Pandas 的高性能笛卡爾積(交叉聯接)

在Pandas 中,計算兩個DataFrame 的笛卡爾積(交叉聯接)可以是必要的操作。雖然多對多 JOIN 技巧對於較小的 DataFrame 相當有效,但隨著資料的增大,效能會下降。

使用 NumPy 快速實現

更快的實現利用 NumPy 進行 1D笛卡爾積計算:

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

上述技巧適用於具有非混合標量資料類型的 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]]]))
    登入後複製
  • 處理非唯一索引:
    上述解決方案可以是擴展為使用非唯一索引。
  • 多DataFrame:
    可以使用以下方式組合多個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)]))
    登入後複製

兩人的簡化解決方案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()]]))
登入後複製

只處理兩個DataFrame時,可以使用更簡單的方法:

性能比較對解決方案進行基準測試表明基於NumPy 的cartesian_product_generalized 是最快的,其次是兩個DataFrame 的cartesian_product_simplified。

以上是如何有效執行 Pandas DataFrame 的笛卡爾積(交叉連接)?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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