pandas 中,交叉连接(cross join)是指将两个 DataFrame 的每一行都与另一个 DataFrame 的每一行进行组合。pandas 没有直接的 cross join 方法,但可以通过添加辅助列,然后使用 merge 或 assign 来实现。本文主要介绍Python pandas中,实现使用交叉连接(cross join)连接两个DataFrame方法及示例代码。

两个示例的DataFrame

left = pd.DataFrame({'col1' : ['A', 'B', 'C'], 'col2' : [1, 2, 3]})
right = pd.DataFrame({'col1' : ['X', 'Y', 'Z'], 'col2' : [20, 30, 50]})
left
col1 col2
0 A 1
1 B 2
2 C 3
right
col1 col2
0 X 20
1 Y 30
2 Z 50

实现交叉连接(cross join)后的效果

A       1      X      20
A 1 Y 30
A 1 Z 50
B 2 X 20
B 2 Y 30
B 2 Z 50
C 3 X 20
C 3 Y 30
C 3 Z 50

1、使用临时“key”列实现

使用 assign 方法生成一个辅助列,然后进行 merge 以实现交叉连接。

import pandas as pd

# 创建两个示例 DataFrame
left = pd.DataFrame({'col1': ['A', 'B', 'C'], 'col2': [1, 2, 3]})
right = pd.DataFrame({'col1': ['X', 'Y', 'Z'], 'col2': [20, 30, 50]})

# 使用 assign 方法生成一个辅助列,然后进行 merge 以实现交叉连接
result = left.assign(key=1).merge(right.assign(key=1), on='key').drop('key', axis=1)

print(result)

2、使用itertools product实现

使用 itertools.product 生成笛卡尔积,实现连接,代码如下,

import pandas as pd
import itertools

# 创建两个示例 DataFrame
left = pd.DataFrame({'col1': ['A', 'B', 'C'], 'col2': [1, 2, 3]})
right = pd.DataFrame({'col1': ['X', 'Y', 'Z'], 'col2': [20, 30, 50]})

# 使用 itertools.product 生成笛卡尔积
l = list(itertools.product(left.values.tolist(), right.values.tolist()))

# 将笛卡尔积展开并转化为 DataFrame
result = pd.DataFrame(list(map(lambda x: sum(x, []), l)))

# 重命名列名
result.columns = ['col1_left', 'col2_left', 'col1_right', 'col2_right']

print(result)

3、使用pandas concat方法实现

使用 pd.concat() 方法进行交叉连接

import pandas as pd

# 创建两个示例 DataFrame
left = pd.DataFrame({'col1': ['A', 'B', 'C'], 'col2': [1, 2, 3]})
right = pd.DataFrame({'col1': ['X', 'Y', 'Z'], 'col2': [20, 30, 50]})

# 使用 concat 方法进行交叉连接
m = pd.concat(
    [
        pd.concat([left] * len(right)).sort_index().reset_index(drop=True),
        pd.concat([right] * len(left)).reset_index(drop=True)
    ],
    axis=1
)

# 重命名列名以清晰区分来自 left 和 right 的数据
m.columns = ['col1_left', 'col2_left', 'col1_right', 'col2_right']

print(m)

推荐文档