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