我有两个具有不同列大小的数据帧,其中四个列在两个数据帧中可以具有相同的值。我想在df1中创建一个新列,如果df2中有一行具有与'A','B','C'和'D'相同的值作为df1中的行,则取值为1 。如果没有这样的行,我希望该值为0.行“E”和“F”对于检查值并不重要。
是否有可以执行此操作的pandas功能,或者我是否需要循环使用此功能。
例如:
df1 =
A B C D E F
1 1 20 20 3 2
1 1 12 14 1 3
2 1 13 43 4 3
2 2 12 34 1 4
df2 =
A B C D E
1 3 12 14 2
1 1 20 20 4
2 2 21 31 5
2 2 12 34 8
预期产出:
df1 =
A B C D E F Target
1 1 20 20 3 2 1
1 1 12 14 1 3 0
2 1 13 43 4 3 0
2 2 12 34 1 4 1
答案 0 :(得分:2)
这很简单。如果检查两个DataFrame是否相等,它会检查每个元素是否等于相应的元素。
col_list = ['A', 'B', 'C', 'D']
idx = (df1.loc[:, col_list] == df2.loc[:, col_list]).all(axis=1)
df1['new_row'] = idx.astype(int)
答案 1 :(得分:1)
我认为您需要merge
left join
和参数indicator=True
,然后将列_merge
与eq
进行比较(与==
相同)并且最后通过astype
将布尔True
和False
转换为1
和0
:
cols = list('ABCD')
df1['Target'] = pd.merge(df1[cols],
df2[cols], how='left', indicator=True)['_merge'].eq('both').astype(int)
print (df1)
A B C D E F Target
0 1 1 20 20 3 2 1
1 1 1 12 14 1 3 0
2 2 1 13 43 4 3 0
3 2 2 12 34 1 4 1
详情:
print (pd.merge(df1[cols], df2[cols], how='left', indicator=True))
A B C D _merge
0 1 1 20 20 both
1 1 1 12 14 left_only
2 2 1 13 43 left_only
3 2 2 12 34 both
答案 2 :(得分:0)
您可以使用逻辑运算符。您可以查看Logic operator for boolean indexing in Pandas或Element-wise logical OR in Pandas了解一些想法。
但是你的规范不足以提供解决方案草图,因为我不知道df1中的行应该如何与df2一起使用。是否行数是相同的,并且df1中的每一行应该具有布尔值的列,在同一行A,B,C和D中的df2中的列是相同的?