场景一
有两个数据帧,分别有一列col1,col2,他们没有相同的key:
left = pd.DataFrame({'col1' : ['A', 'B', 'C']})
right = pd.DataFrame({'col2' : [1, 2, 3, 4]})
需要生成交叉连接(cross join)的效果:
col1 col2
A 1
A 2
A 3
A 4
B 1
B 2
B 3
B 4
C 1
C 2
C 3
C 4
思路
用merge函数是可以实现类似于SQL的join操作的,但是这个函数必须指定一个join的key,所以将left和right分别指定一个临时的key即可
实现
left_with_key = left.assign(key=1)
# col1 key
# A 1
# B 1
# C 1
right_with_key = right.assign(key=1)
# col2 key
# 1 1
# 2 1
# 3 1
# 4 1
join_result = left_with_key.merge(right_with_key, on='key').drop('key', 1)
# col1 col2
# A 1
# A 2
# A 3
# A 4
# B 1
# B 2
# B 3
# B 4
# C 1
# C 2
# C 3
# C 4
场景二
有两列数据col1,col2
col1 = ['A', 'B', 'C']
col2 = [1, 2, 3, 4]
同样,需要生成交叉连接(cross join)的效果:
col1 col2
A 1
A 2
A 3
A 4
B 1
B 2
B 3
B 4
C 1
C 2
C 3
C 4
思路
用MultiIndex.from_product函数先生成类似于交叉集的索引,然后再用reset_index函数将索引转换为数据帧
实现
join_index = pd.MultiIndex.from_product([col1, col2], names=['col1', 'col2'])
#MultiIndex([('A', 1),
# ('A', 2),
# ('A', 3),
# ('A', 4),
# ('B', 1),
# ('B', 2),
# ('B', 3),
# ('B', 4),
# ('C', 1),
# ('C', 2),
# ('C', 3),
# ('C', 4)],
# names=['col1', 'col2'])
join_result = pd.DataFrame(index=join_index).reset_index()
# col1 col2
# A 1
# A 2
# A 3
# A 4
# B 1
# B 2
# B 3
# B 4
# C 1
# C 2
# C 3
# C 4
参考
- https://www.cjavapy.com/article/391/
- http://www.360doc.com/content/18/0420/22/1489589_747395997.shtml