Удаление строк панд на основе сочетания сопоставленных значений столбца с другим фреймом данных - PullRequest
0 голосов
/ 08 февраля 2019

Настройка

У меня есть 2 панды dfs (df1 и df2), которые содержат несколько перекрывающихся строк и несколько непересекающихся строк.

Оба dfs имеют столбцы order_id и shop.

Теперь, если строка в df1 соответствует какой-либо строке в df2 по комбинации order_id и shop, тогдаэтот ряд должен быть удален из df1.Если эта строка не совпадает ни с одной строкой в ​​df2 на order_id и shop, ее следует сохранить.


Пример

df2 таков, что

    order_id    shop
0     12345     'NL'
1     45678     'FR'
2     12345     'DE'
3     34567     'NL'

Теперь, если df1 такой, что

    order_id    shop
0     12345     'NL'
1     45678     'FR'

тогда df1 должен вернуться пустым.


Но если df1 такое, что

        order_id    shop
0       12345       'NL'
1       99999       'FR'
2       12345       'UK'

, то df1 должно вернуться,

        order_id    shop
0       99999       'FR'
1       12345       'UK'

Код

Я создал чудовищную линию, которая тогда действительно не работала ...

Пока что у меня есть,

result_df = df1[(~df1['order_id'].astype(str).isin(df2['order_id'].astype(str)))]

Как мне решить эту проблему?

1 Ответ

0 голосов
/ 08 февраля 2019

Я думаю, что столбцы разных типов не совпадают, поэтому сначала преобразуйте их в string, а затем merge с indicator=True:

df3 = (df1.astype(str).merge(df2.astype(str), how='left', indicator=True)
          .query('_merge == "left_only"')[df1.columns])
print (df3)
   order_id  shop
2     99999  'FR'
3     12345  'UK'

Также возможна проверка на наличие одинаковых dtypes перед решением:

print (df1.dtypes)
print (df2.dtypes))

И конвертировать только столбцы, которые отличаются dtype:

df2['order_id'] = df2['order_id'].astype(str)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...