Соединение панелей данных pandas одинаковых столбцов и получение ТОЛЬКО элементов из таблицы B, отсутствующих в A - PullRequest
0 голосов
/ 08 мая 2018

У меня есть два кадра данных, dfA и dfB одинаковых столбцов. Я ищу, чтобы получить только те записи из кадра данных dfB, которые отсутствуют в кадре данных dfA.

для ясности, я не хочу получать записи в dfA, которых нет в dfB.

Мне удалось взломать что-то, что работает, используя this , но код не так прост для понимания и, как следствие, не очень питоничен.

Я ищу более элегантное решение, возможно, с использованием pandas join / merge / append, но не смог заставить его работать.

Пример того, что я хочу:

  dfA: 
  Date       Category  Price 
1 2013-11-24 Coat      22.1
2 2013-11-24 Shirt     8.7
3 2013-11-01 Socks     9     <<< Only present in this df

  dfB:
  Date       Category  Price 
1 2013-11-24 Coat      22.1
2 2013-11-24 Shirt     8.7
3 2013-11-24 Helmet    2.1   <<< Only present in this df
4 2013-11-24 Pants     10.7  <<< Only present in this df

  Result:
  Date       Category  Price 
1 2013-11-24 Helmet    2.1
2 2013-11-24 Pants     10.7

Ответы [ 3 ]

0 голосов
/ 08 мая 2018

Используйте merge с внешним соединением и фильтруйте по столбцу индикатора с помощью boolean indexing:

df = pd.merge(dfA, dfB, indicator=True, how='outer')
print (df)
         Date Category  Price      _merge
0  2013-11-24     Coat   22.1        both
1  2013-11-24    Shirt    8.7        both
2  2013-11-01    Socks    9.0   left_only
3  2013-11-24   Helmet    2.1  right_only
4  2013-11-24    Pants   10.7  right_only

df1 = df[df['_merge'] == 'right_only'].drop('_merge', axis=1)
print (df1)
         Date Category  Price
3  2013-11-24   Helmet    2.1
4  2013-11-24    Pants   10.7
0 голосов
/ 08 мая 2018

Если у вас есть уникальный столбец в вашей таблице, по которой вы фильтруете. Возможно на Category в вашем случае.

Вы можете использовать:

dfB[~dfB['Category'].isin(dfA['Category'])]
0 голосов
/ 08 мая 2018

Одним из идиоматических подходов является использование merge(..., how='outer', indicator=True) и фильтрация результирующего DF по сгенерированному столбцу _merge:

In [18]: (A.merge(B, how='outer', indicator=True)
           .query("_merge == 'right_only'")
           .drop('_merge',1))
Out[18]:
         Date Category  Price
3  2013-11-24   Helmet    2.1
4  2013-11-24    Pants   10.7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...