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中文网其他相关文章!