首页 >后端开发 >Python教程 >如何在 Pandas 中高效地执行笛卡尔积(CROSS JOIN)?

如何在 Pandas 中高效地执行笛卡尔积(CROSS JOIN)?

Susan Sarandon
Susan Sarandon原创
2024-12-09 04:07:13776浏览

How Can I Efficiently Perform a Cartesian Product (CROSS JOIN) in Pandas?

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn