如何在Pandas中对两个数据框进行交集匹配?

3
假设存在两个DataFrame,一个是A,另一个是B,如下所示:
A:
a A
b B
c C

"B":
1 2
3 4

如何生成类似于 CDataFrame
a  A  1 2
a  A  3 4
b  B  1 2
b  B  3 4
c  C  1 2
c  C  3 4

有没有 Pandas 中可以执行这个操作的函数?
1个回答

2

首先,每个 DataFrame 中的所有值都必须是唯一的。

我认为你需要使用 product

from  itertools import product

A = pd.DataFrame({'a':list('abc')})
B = pd.DataFrame({'a':[1,2]})

C = pd.DataFrame(list(product(A['a'], B['a'])))
print (C)
   0  1
0  a  1
1  a  2
2  b  1
3  b  2
4  c  1
5  c  2

使用MultiIndex.from_product实现Pandas的纯解决方案:

mux = pd.MultiIndex.from_product([A['a'], B['a']])

C = pd.DataFrame(mux.values.tolist())
print (C)
   0  1
0  a  1
1  a  2
2  b  1
3  b  2
4  c  1
5  c  2

C = mux.to_frame().reset_index(drop=True)
print (C)
   0  1
0  a  1
1  a  2
2  b  1
3  b  2
4  c  1
5  c  2

使用merge和由assign填充相同标量的列进行交叉连接的解决方案:

df = pd.merge(A.assign(tmp=1), B.assign(tmp=1), on='tmp').drop('tmp', 1)
df.columns = ['a','b']
print (df)
   a  b
0  a  1
1  a  2
2  b  1
3  b  2
4  c  1
5  c  2

编辑:

A = pd.DataFrame({'a':list('abc'), 'b':list('ABC')})
B = pd.DataFrame({'a':[1,3], 'c':[2,4]})

print (A)
   a  b
0  a  A
1  b  B
2  c  C

print (B)
   a  c
0  1  2
1  3  4

C = pd.merge(A.assign(tmp=1), B.assign(tmp=1), on='tmp').drop('tmp', 1)
C.columns = list('abcd')
print (C)
   a  b  c  d
0  a  A  1  2
1  a  A  3  4
2  b  B  1  2
3  b  B  3  4
4  c  C  1  2
5  c  C  3  4

非常感谢!但是如果每个DataFrame有多列呢? - danche
嗯,这取决于你的需求。你需要所有列的所有组合吗?也许最好创建一个新问题,并提供所需的输出。 - jezrael
我编辑了我的问题 :-)。现在我使用了您的第三个解决方案,它可以很好地工作,但是如果有很多需要处理的DataFrame,那么在分配和删除方面会花费很多时间吗? - danche
不确定是否理解。您是否有许多数据框,并需要一个包含所有组合的大型数据框? - jezrael
1
谢谢!我也用了这个方法! - danche
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接