首页 > 后端开发 > Python教程 > 如何有效地执行 Pandas DataFrame 的笛卡尔积(交叉连接)?

如何有效地执行 Pandas DataFrame 的笛卡尔积(交叉连接)?

Barbara Streisand
发布: 2024-12-13 02:56:09
原创
834 人浏览过

How Can I Efficiently Perform a Cartesian Product (Cross Join) of Pandas DataFrames?

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板