如何实现两个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
相关产品推荐
相关产品推荐

