Как использовать isin (без слияния) для нескольких столбцов данных - PullRequest
0 голосов
/ 03 мая 2020

У меня есть два кадра данных:

df1

   Company  Symbol     ID         Date    Value
0  AAA Inc       A    123   2019-12-31       10
1  AAA Inc       A    123   2020-03-30       11
2  BBB Inc       B    456   2019-03-31       12
3  FFF Inc       F    653   2019-06-31       22
4  ZZZ Inc       Z    999   2019-03-30       13

df2

   Company  Symbol     ID         Date   Price
0  AAA Inc       A    123   2019-12-31      10
1  AAA Inc       A    123   2019-09-30      20
2  AAA Inc       A    123   2019-06-31      30
3  AAA Inc       A    123   2019-03-30      40
4  BBB Inc       B    456   2019-12-31      50
5  BBB Inc       B    456   2019-09-30      50
6  BBB Inc       B    456   2019-06-31      90
7  BBB Inc       B    456   2019-03-31      10
8  CCC Inc       C    789   2019-12-31      79
9  CCC Inc       C    789   2019-09-31      43

И я хочу создать третий кадр данных, который будет все ['Symbol', 'ID', 'Date'] строк, которые находятся в df1, но не в df2. Таким образом, результат будет выглядеть следующим образом:

   Company  Symbol     ID         Date
0  AAA Inc       A    123   2020-03-30
1  FFF Inc       F    653   2019-06-31
2  ZZZ Inc       Z    999   2019-03-30

Я знаю, что могу сделать что-то вроде df3 = df1[~df1['Symbol'].isin(df2['Symbol'])], но после некоторых исследований не похоже, что есть хороший способ использовать isin с несколькими столбцы.

Я также проверил похожие вопросы , но не нашел ничего, касающегося только указанных c столбцов.

Я также хотел бы избежать объединение двух кадров данных, если это возможно.

Так как бы мне этого добиться?

1 Ответ

2 голосов
/ 03 мая 2020

Поскольку вы хотите избежать merge, вот одно из возможных решений: сравнить MultiIndex с Index.isin:

cols = ['Symbol', 'ID', 'Date']
df3 = df1[~df1.set_index(cols).index.isin(df2.set_index(cols).index)]
print (df3)
  Company Symbol   ID        Date  Value
1     AAA  Inc A  123  2020-03-30     11
3     FFF  Inc F  653  2019-06-31     22
4     ZZZ  Inc Z  999  2019-03-30     13

Или преобразовать столбцы в кортежи:

cols = ['Symbol', 'ID', 'Date']
df3 = df1[~df1[cols].apply(tuple, 1).isin(df2[cols].apply(tuple, 1))]

Для сравнения решения с параметрами merge и indicator:

cols = ['Symbol', 'ID', 'Date']
df3 = (df1.merge(df2, on=cols, indicator=True, how='left', suffixes=('','_'))
          .query("_merge == 'left_only'")[df1.columns])
print (df3)
  Company Symbol   ID        Date  Value
1     AAA  Inc A  123  2020-03-30     11
3     FFF  Inc F  653  2019-06-31     22
4     ZZZ  Inc Z  999  2019-03-30     13
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...