我有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)
但这并不是我所期待的
如何实现?
答案 0 :(得分:2)
一种方法是使用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)