两个示例的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)