Python 查找2列的2个dataframe的公共行
我有两个数据帧,如下所示:Python 查找2列的2个dataframe的公共行,python,pandas,Python,Pandas,我有两个数据帧,如下所示: 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 所以,我想比较两个数据帧
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列)的哪些行相同,并在第一个数据帧的coulmn D上赋值1
我一直在使用以下代码:
print (df1['A'].isin(df2['A']) & df1['B'].isin(df2['B'])).astype(int)
但这并不是我所期望的
如何实现这一点?一种方法是使用
merge
函数选择要加入的键
因此,首先,如果我们在DF2
中创建某种指标,并加入,我们有:
DF2['inDF2'] = 1
DF3 = pd.merge(DF1, DF2, how='left', left_on=['A', 'B'], right_on=['K', 'L'])
然后,只需添加列D
和inDF2
,即可获得所需的结果
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)
一种方法是使用
merge
函数选择要加入的键
因此,首先,如果我们在DF2
中创建某种指标,并加入,我们有:
DF2['inDF2'] = 1
DF3 = pd.merge(DF1, DF2, how='left', left_on=['A', 'B'], right_on=['K', 'L'])
然后,只需添加列D
和inDF2
,即可获得所需的结果
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)
我认为这个问题属于StackOverflow,希望版主能为您迁移到那里。我认为这个问题属于StackOverflow,希望版主能为您迁移到那里。