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 的解决方案
上述技巧适用于具有非混合标量数据类型的 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
当仅处理两个 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 的 cartesian_product_generalized 是最快的,其次是两个 DataFrame 的 cartesian_product_simplified。
以上是如何有效地执行 Pandas DataFrame 的笛卡尔积(交叉连接)?的详细内容。更多信息请关注PHP中文网其他相关文章!