查找2列的2个数据帧的公共行

时间:2015-05-19 01:51:35

标签: python pandas

我有2个Python pandas Dataframe如下:

DF1=
    A    B   C    D
0   AA   BA  KK   0
1   AD   BD  LL   0
2   AF   BF  MM   0

DF2=
    K    L
0   AA   BA
1   AD   BF

最后我想得到的是:

DF1=
    A    B   C    D
0   AA   BA  KK   1
1   AD   BD  LL   0
2   AF   BF  MM   0

所以,我想比较两个数据帧,我想看看第一个数据帧的哪一行(对于列A和B)与第二个数据帧(列K和L)的共同点,并在库存D上分配1第一个数据帧。

我一直在使用以下代码:

print (df1['A'].isin(df2['A']) & df1['B'].isin(df2['B'])).astype(int)

但这并不是我所期待的

如何实现?

1 个答案:

答案 0 :(得分:2)

一种方法是使用merge函数选择要加入的键。

首先,如果我们在DF2中创建某种指标并加入,我们就会:

DF2['inDF2'] = 1
DF3 = pd.merge(DF1, DF2, how='left', left_on=['A', 'B'], right_on=['K', 'L'])

然后,您只需添加列DinDF2即可获得所需的结果。

DF3['D'] = DF3['D'] + DF3['inDF2'].fillna(0)

删除相关列将获得您所追求的数据集:

DF3.drop(['K', 'L', 'inDF2'], axis=1, inplace=True)

输出:

>>> DF3
    A   B   C  D
0  AA  BA  KK  1
1  AD  BD  LL  0
2  AF  BF  MM  0

完整代码:

import pandas as pd

d1 = {
'A' : ['AA', 'AD', 'AF'],
'B' : ['BA', 'BD', 'BF'],
'C' : ['KK', 'LL', 'MM'],
'D' : [0, 0, 0]
}

d2 = {
'K' : ['AA', 'AD'],
'L' : ['BA', 'BF']
}

DF1 = pd.DataFrame(data=d1)
DF2 = pd.DataFrame(data=d2)
DF2['inDF2'] = 1

DF3 = pd.merge(DF1, DF2, how='left', left_on=['A', 'B'], right_on=['K', 'L'])
DF3['D'] = DF3['D'] + DF3['inDF2'].fillna(0)
DF3.drop(['K', 'L', 'inDF2'], axis=1, inplace=True)