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