使用 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()]]))
性能比较
对这些方法进行基准测试表明,基于 NumPy 的实现提供了最快的性能,特别是对于较大的数据集:
[性能比较图图像]
进一步阅读
要深入了解 Pandas 合并操作,请探索以下内容主题:
以上是如何在 Pandas 中高效地执行 CROSS JOIN?的详细内容。更多信息请关注PHP中文网其他相关文章!