0

0

Pandas中高效实现两个DataFrame的笛卡尔积(交叉连接)

心靈之曲

心靈之曲

发布时间:2025-12-07 20:56:02

|

252人浏览过

|

来源于php中文网

原创

Pandas中高效实现两个DataFrame的笛卡尔积(交叉连接)

本教程将指导您如何在pandas中高效地执行两个dataframe的笛卡尔积(交叉连接)操作。我们将通过添加辅助合并键并利用`pd.merge`函数,避免低效的循环,快速生成所有可能的行组合,从而实现数据表的全面扩展与整合,尤其适用于大规模数据集。

引言:理解笛卡尔积需求

在数据处理中,我们有时需要将两个或多个数据集中的所有记录进行两两组合,形成一个包含所有可能组合的新数据集。这种操作在关系型数据库中被称为“交叉连接”(Cross Join),在数学上则称为“笛卡尔积”(Cartesian Product)。例如,如果您有一个包含日期列表的DataFrame df_1,以及一个包含人员信息的DataFrame df_2,您可能希望创建一个新DataFrame,其中包含每个日期与每个人员信息的所有组合。

考虑以下两个示例DataFrame:

df_1:

           A1
0  2023-12-30
1  2023-12-31

df_2:

      B1    B2      B3
501  Sam    159cm   300gm
502  Tam    175cm   400gm

我们期望的输出结果 df_result 应该将 df_1 中的每个日期与 df_2 中的每个人员信息进行组合,如下所示:

df_result:

           A1   B1     B2     B3
0  2023-12-30  Sam  159cm  300gm
1  2023-12-31  Sam  159cm  300gm
2  2023-12-30  Tam  175cm  300gm
3  2023-12-31  Tam  175cm  400gm

尽管使用 for 循环可以实现这一目标,但对于大型DataFrame来说,这种方法效率极低,会导致显著的性能问题。因此,我们需要一种更“Pythonic”和“Pandas”化的解决方案。

Pandas实现笛卡尔积的高效方法

Pandas库提供了强大的合并(merge)功能,通过巧妙地利用这一功能,我们可以高效地实现笛卡尔积。核心思想是为两个DataFrame添加一个共同的、具有相同常数值的辅助列,然后基于这个辅助列进行内连接(inner merge)。

1. 准备示例数据

首先,我们创建上述示例中提到的两个DataFrame:

import pandas as pd

# DataFrame 1
data_1 = {'A1': ['2023-12-30', '2023-12-31']}
df_1 = pd.DataFrame(data_1)

# DataFrame 2
data_2 = {'B1': ['Sam', 'Tam'],
          'B2': ['159cm', '175cm'],
          'B3': ['300gm', '400gm']}
df_2 = pd.DataFrame(data_2, index=[501, 502]) # 保持原始索引,但实际合并中索引不重要

print("df_1:")
print(df_1)
print("\ndf_2:")
print(df_2)

2. 添加辅助合并键

为了执行笛卡尔积,我们需要在两个DataFrame中都添加一个具有相同常数值的临时列。这个列将作为我们合并操作的键。

# 为df_1添加一个名为'key'的辅助列,所有值为1
df_1['key'] = 1

# 为df_2添加一个名为'key'的辅助列,所有值为1
df_2['key'] = 1

print("\ndf_1 with key:")
print(df_1)
print("\ndf_2 with key:")
print(df_2)

此时,df_1和df_2看起来会是这样:

df_1 with key:

Lumen5
Lumen5

一个在线视频创建平台,AI将博客文章转换成视频

下载
           A1  key
0  2023-12-30    1
1  2023-12-31    1

df_2 with key:

      B1     B2     B3  key
501  Sam  159cm  300gm    1
502  Tam  175cm  400gm    1

3. 执行内部合并(Inner Merge)

现在,我们可以使用 pd.merge() 函数,指定 on='key' 和 how='inner' 来执行合并操作。由于两个DataFrame中的所有行都共享相同的 key 值(即 1),pd.merge 会将 df_1 中的每一行与 df_2 中的每一行进行匹配,从而生成笛卡尔积。

# 执行内部合并
df_result = pd.merge(df_1, df_2, on='key', how='inner')

print("\nMerged DataFrame (before dropping key):")
print(df_result)

合并后的结果会包含辅助列 key:

Merged DataFrame (before dropping key):

           A1  key   B1     B2     B3
0  2023-12-30    1  Sam  159cm  300gm
1  2023-12-30    1  Tam  175cm  400gm
2  2023-12-31    1  Sam  159cm  300gm
3  2023-12-31    1  Tam  175cm  400gm

请注意,这里的行顺序可能与示例输出略有不同,但所有组合都已生成。Pandas合并的默认行为是保留左侧DataFrame的顺序,然后按右侧DataFrame的匹配顺序。

4. 清理辅助列

最后一步是移除不再需要的辅助列 key,以获得最终的笛卡尔积结果。

# 移除辅助列'key'
df_result = df_result.drop('key', axis=1)

print("\nFinal df_result (Cartesian Product):")
print(df_result)

最终的 df_result 将与我们期望的输出完全一致。

完整示例代码

以下是实现两个DataFrame笛卡尔积的完整、简洁的代码:

import pandas as pd

# 1. 准备示例数据
df_1 = pd.DataFrame({'A1': ['2023-12-30', '2023-12-31']})
df_2 = pd.DataFrame({'B1': ['Sam', 'Tam'],
                     'B2': ['159cm', '175cm'],
                     'B3': ['300gm', '400gm']})

print("df_1:")
print(df_1)
print("\ndf_2:")
print(df_2)

# 2. 添加辅助合并键并执行内部合并,然后清理
df_result = pd.merge(df_1.assign(key=1),
                     df_2.assign(key=1),
                     on='key',
                     how='inner').drop('key', axis=1)

print("\nFinal df_result (Cartesian Product):")
print(df_result)

原理分析

这种方法的有效性在于 pd.merge 函数在执行 inner 合并时的行为。当两个DataFrame都含有一个名为 key 且所有值都为 1 的列时,pd.merge 会尝试将 df_1 中 key 值为 1 的每一行,与 df_2 中 key 值为 1 的每一行进行匹配。由于所有的行都满足 key == 1 的条件,因此 df_1 的每一行都会与 df_2 的每一行进行组合,从而完美地实现了笛卡尔积。

注意事项与性能考量

  1. 内存消耗: 笛卡尔积的结果集大小是两个原始DataFrame行数的乘积。如果原始DataFrame很大,结果DataFrame可能会非常庞大,迅速耗尽系统内存。在执行此操作之前,请务必评估潜在的结果集大小。
    • 例如,如果 df_1 有1000行,df_2 有1000行,结果将有 1000 * 1000 = 1,000,000 行。
  2. 列名冲突: 如果 df_1 和 df_2 中存在除了合并键(key)之外的同名列,pd.merge 会自动为这些冲突的列添加后缀(例如 _x 和 _y)来区分它们。如果需要,您可以在合并后重命名这些列。
  3. 效率: 相较于 for 循环,使用 pd.merge 是Pandas中实现笛卡尔积的推荐方式,因为它利用了Pandas底层的C语言优化,执行效率极高,尤其适用于大规模数据集。

总结

通过为两个DataFrame添加一个具有相同常数值的辅助列,并利用 pd.merge 进行内连接,我们可以高效、简洁地实现两个DataFrame的笛卡尔积。这种方法避免了低效的循环,是处理大规模数据集时进行全面组合的强大工具。理解其背后的原理和潜在的内存消耗,将帮助您更有效地利用Pandas进行数据处理。

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

395

2023.06.20

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

617

2023.07.25

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

354

2023.08.02

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

257

2023.08.09

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

600

2023.09.05

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

525

2023.09.20

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

640

2023.09.20

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

601

2023.09.22

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

15

2026.01.20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 6.4万人学习

Django 教程
Django 教程

共28课时 | 3.3万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号