在熊猫数据框中查找具有相同列值的行
问题描述:
我有两个具有不同列大小的数据框,其中四列在两个数据框中可以具有相同的值。我想在df1中创建一个新列,如果在df2中有一行的列'A','B','C'和'D'具有与df1中的行相同的值,则值为1 。如果没有这样的行,我希望该值为0.行'E'和'F'对于检查值并不重要。在熊猫数据框中查找具有相同列值的行
有熊猫的功能,可以做到这一点,或者我必须在循环中。
例如:
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
答
这是相当简单的。如果您检查两个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)
答
我认为你需要merge
与left join
和参数indicator=True
,然后用eq
(同==
)比较列_merge
和最后转换布尔True
和False
到1
和0
由astype
:
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
答
您可以使用逻辑运算符。有些想法可以参考Logic operator for boolean indexing in Pandas或Element-wise logical OR in Pandas。
但是您的规范不足以提供解决方案草图,因为我不知道df1中的行应如何与df2一起使用。是否行数相同,并且df1中的每行都应具有与同一行中的df2中的布尔值相同的行的列A,B,C和D是相同的?