Как использовать isin при игнорировании индекса - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь проверить, существуют ли строки в другом кадре данных.Я не присоединяюсь и не объединяюсь из-за проблем, связанных с созданием дублирования, а затем с необходимостью отфильтровывать это дублирование, а также отфильтровывать фактическое дублирование, которое я хочу сохранить.

пример:

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 голосов
/ 01 июня 2018

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
0 голосов
/ 01 июня 2018

Если необходимо сравнить каждое значение отдельно, преобразуйте 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...