首页 > 后端开发 > Python教程 > 如何在 Pandas 中高效地执行 CROSS JOIN?

如何在 Pandas 中高效地执行 CROSS JOIN?

Barbara Streisand
发布: 2024-12-06 02:21:11
原创
328 人浏览过

How to Efficiently Perform a CROSS JOIN in Pandas?

使用 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 合并操作,请探索以下内容主题:

  • [合并基础知识](https://pbpython.com/pandas-merging-101-cheat-sheet.html)
  • [基于索引的连接](https://pbpython.com/pandas-merging-101- join-indexes.html)
  • [推广到多个数据帧](https://pbpython.com/pandas-merging-on-multiple-dataframes.html)

以上是如何在 Pandas 中高效地执行 CROSS JOIN?的详细内容。更多信息请关注PHP中文网其他相关文章!

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