You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现两个DataFrame的全量组合(笛卡尔积合并)?

Pandas实现两个DataFrame的全量行配对(笛卡尔积)

你需要的是两个DataFrame的笛卡尔积组合,即让第一个DataFrame的每一行都与第二个的所有行逐一配对,Pandas有现成的内置方法可以高效实现,无需手动遍历拼接。


示例输入数据

import pandas as pd

d1 = pd.DataFrame([[1,3],[2,4]])
print(d1)
# 输出:
#    0  1
# 0  1  3
# 1  2  4

d2 = pd.DataFrame([['A','D'],['B','E'],['C','F']])
print(d2)
# 输出:
#    0  1
# 0  A  D
# 1  B  E
# 2  C  F

方法1:Pandas 1.2.0+ 直接使用merge的how='cross'(推荐)

这是官方提供的最简洁的笛卡尔积实现方式:

d3 = d1.merge(d2, how='cross')
print(d3)
# 输出:
#    0_x  1_x 0_y 1_y
# 0    1    3   A   D
# 1    1    3   B   E
# 2    1    3   C   F
# 3    2    4   A   D
# 4    2    4   B   E
# 5    2    4   C   F

如果需要将列名改为连续数字(与你的示例一致),可重命名列:

d3.columns = range(d3.shape[1])
print(d3)
# 输出:
#    0  1  2  3
# 0  1  3  A  D
# 1  1  3  B  E
# 2  1  3  C  F
# 3  2  4  A  D
# 4  2  4  B  E
# 5  2  4  C  F

方法2:兼容低版本Pandas(1.2.0以下)

如果你的Pandas版本较低,没有how='cross'参数,可通过添加临时键列实现:

# 给两个DataFrame添加相同的临时键
d1['key'] = 1
d2['key'] = 1

# 基于临时键做内连接,得到笛卡尔积
d3 = d1.merge(d2, on='key').drop('key', axis=1)

# 重命名列(可选)
d3.columns = range(d3.shape[1])
print(d3)
# 输出与示例完全一致

对比手动遍历方法

你之前用遍历+concat的方法虽然可行,但当DataFrame数据量较大时,内置的merge方法效率会高很多——底层采用向量化操作,避免了循环带来的性能损耗。

内容的提问来源于stack exchange,提问作者louis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 21:41:04