检查一个数据框中的值是否存在于另一个数据框中。

53

我有两个数据框。

Df1 = pd.DataFrame({'name': ['Marc', 'Jake', 'Sam', 'Brad']
Df2 = pd.DataFrame({'IDs': ['Jake', 'John', 'Marc', 'Tony', 'Bob']
我希望循环遍历Df1['name']中的每一行,并检查每个名称是否出现在Df2['IDs']中。

如果名称存在,则结果应返回1,如果不存在,则返回0,如下所示:

Marc  1 
Jake  1
Sam   0 
Brad  0
感谢您。

2
对于那些有同样问题的人,只想要布尔值(TrueFalse)的,请不要使用.astype(int)。只需使用df1[col].isin(df2[col])即可。 - Trenton McKinney
4个回答

81

使用 isin 方法

Df1.name.isin(Df2.IDs).astype(int)

0    1
1    1
2    0
3    0
Name: name, dtype: int32

在数据框中显示结果

Df1.assign(InDf2=Df1.name.isin(Df2.IDs).astype(int))

   name  InDf2
0  Marc      1
1  Jake      1
2   Sam      0
3  Brad      0
在Series对象中
pd.Series(Df1.name.isin(Df2.IDs).values.astype(int), Df1.name.values)

Marc    1
Jake    1
Sam     0
Brad    0
dtype: int32

1
完美。谢谢。 - toceto
必须包含数据类型吗? - Yonela Nuba
我曾经遇到过一个问题,就是如何检查数据框中的值是否存在于序列或其他数据框中!我一直收到错误提示“Series”对象是可变的,因此它们无法被哈希,而且无论我如何创建序列,它都不是不可变的。这是唯一有效的方法。但是,我无法使用assign.创建新列。没有错误提示,但也没有列。Df1["InDf2"] = Df1.name.isin...确实创建了该列。谢谢! - DrWhat

17

这应该可以做到:

Df1 = Df1.assign(result=Df1['name'].isin(Df2['IDs']).astype(int))

这是解决方案,如果你想在你的数据框中使用它,piRSquared的解决方案只会打印结果。 - PV8
如何在上述代码中添加一个条件。例如,如果DF1 ['name']中有一些值,我想跳过@zipa的检查。 - yoyo

14

通过使用merge

s=Df1.merge(Df2,left_on='name',right_on='IDs',how='left')
s.IDs=s.IDs.notnull().astype(int)
s
Out[68]: 
   name  IDs
0  Marc    1
1  Jake    1
2   Sam    0
3  Brad    0

9

这是一种方法。将其转换为集合以进行O(1)查找,并使用astype(int)将布尔值表示为整数。

values = set(Df2['IDs'])

Df1['Match'] = Df1['name'].isin(values).astype(int)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接