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中文網其他相關文章!