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

Настройка

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

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

Теперь, если строка df1 совпадает со строкой df2 в комбинации order_id и shop, тогда ничего,Но если строка df1 не совпадает со строкой df2 в комбинации order_id и shop, то эту строку df1 следует добавить к df2.


Пример

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 так, что

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

, то строки 1 и 2 должны быть добавлены к df2, хотя shop значения для строки 1 и order_id для строки 2 уже находятся в df2.

Получившийся df2 должен выглядеть следующим образом:

    order_id    shop
0     99999     'FR'
1     12345     'UK'        
2     12345     'NL'
3     45678     'FR'
4     12345     'DE'
5     34567     'NL' 

Обратите внимание, что столбец order_id имеет тип int, а столбец shop - строка.

Итак, в графическом плане то, что я хочу достичь, выглядит следующим образом:

enter image description here

Код

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

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

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

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


ДОПОЛНИТЕЛЬНО

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

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

, как мне сравнить df1 с df2 таким, что я получаю df3который выглядит как

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

Ответы [ 2 ]

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

Похоже, вы хотите создать набор из всех возможных комбинаций?Если это так, вы можете создать уникальные пары, используя следующее:

import pandas as pd

data1 = {'order_id': [12345, 45678, 78901, 12345, 12901, 12345], 'shop': ['NL', 'FR', 'AB', 'AB', 'NL', 'NL']}
df1 = pd.DataFrame(data=data1)

data2= {'order_id': [12345, 45678, 12345, 34567], 'shop': ['NL', 'FR', 'DE', 'NL']}
df2 = pd.DataFrame(data=data2)

df3 = df1
df3['Combi'] = df3['order_id'].astype('str') + df3['shop']
df3.drop_duplicates('Combi', inplace=True)

df1 df3

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

Если все строки уникальны, используйте concat с drop_duplicates:

df = pd.concat([df2, df1], ignore_index=True).drop_duplicates()
print (df)
   order_id  shop
0     12345  'NL'
1     45678  'FR'
2     12345  'DE'
3     34567  'NL'
5     99999  'FR'
6     12345  'UK'

Если не уникальный фильтр, не равные строки по merge с indicator=True и затем concat до df2:

df3 = df1.merge(df2, how='left', indicator=True).query('_merge == "left_only"')[df1.columns]
df = pd.concat([df2, df3], ignore_index=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...