如何在Pandas中的2个DataFrame之间进行交叉匹配?

时间:2017-08-15 06:47:02

标签: pandas dataframe

假设存在2个 DataFrames AB,如下所示

A

a A
b B
c C

B

1 2
3 4

如何制作C DataFrame ,如

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 个答案:

答案 0 :(得分: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