如何在忽略索引的同时使用isin

时间:2018-06-01 14:08:23

标签: python pandas

我正在尝试检查另一个数据帧中是否存在行。我没有加入/合并,因为它创建了重复的问题,然后需要过滤掉复制也可能过滤掉我想要保留的实际重复。

示例:

table1 = pd.DataFrame({'a':[1, 2, 5, 3, 4],
              'b':['a', 'b', 'e', 'c', 'd']})
table2 = pd.DataFrame({'a':[1, 4, 3, 6, 2],
              'b':['a', 'd', 'c', 'f', 'b']})


table1.isin(table2)

       a      b
0   True   True
1  False  False
2  False  False
3  False  False
4  False  False

我希望所有这些都是True,但索引2除外5 e中不存在行table2

2 个答案:

答案 0 :(得分:5)

IIUC

table1.stack().isin(table2.stack().values).unstack()
Out[207]: 
       a      b
0   True   True
1   True   True
2  False  False
3   True   True
4   True   True

如果检查行基数

table1.astype(str).sum(1).isin(table2.astype(str).sum(1))

使用merge

table1.merge(table2.assign(vec=True),how='left').fillna(False)
Out[232]: 
   a  b    vec
0  1  a   True
1  2  b   True
2  5  e  False
3  3  c   True
4  4  d   True

答案 1 :(得分:3)

如果需要比较每个值,请将table2转换为1d数组:

a = table1.isin(table2.values.ravel())
print (a)
       a      b
0   True   True
1   True   True
2  False  False
3   True   True
4   True   True

如果需要分别比较每一行:

a = (table1.apply(tuple, 1).isin(table2.apply(tuple, 1)))

或者:

a = (table1.astype(str).apply('###'.join, 1).isin(table2.astype(str).apply('###'.join, 1).))


print (a)
0     True
1     True
2    False
3     True
4     True
dtype: bool

为了更好地解释,输入数据已更改:

table1 = pd.DataFrame({'a':[1, 2, 5, 3, 4],
              'b':['d', 'b', 'e', 'c', 'd']})
table2 = pd.DataFrame({'a':[1, 4, 3, 6, 2],
              'b':['a', 'd', 'c', 'f', 'b']})

print (table1)
   a  b
0  1  d -> changed to d
1  2  b
2  5  e
3  3  c
4  4  d

print (table2)
   a  b
0  1  a
1  4  d
2  3  c
3  6  f
4  2  b
a = table1.isin(table2.values.ravel())
print (a)
       a      b
0   True   True  d exist in table2, so True
1   True   True
2  False  False
3   True   True
4   True   True

a = (table1.apply(tuple, 1).isin(table2.apply(tuple, 1)))
print (a)
0    False -> comparing 1-a with 1-b return False
1     True
2    False
3     True
4     True
dtype: bool