使用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()]]))
效能比較
效能比較效能比較
效能比較以上是如何在 Pandas 中有效率地執行 CROSS JOIN?的詳細內容。更多資訊請關注PHP中文網其他相關文章!