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)
泛化為唯一索引資料幀:
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)]))
兩
兩人的簡化解決方案DataFramesdef 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中文網其他相關文章!