Добавлять / вставлять / выполнять строки в кадре данных, только если запись еще не существует - PullRequest
1 голос
/ 20 сентября 2019

У меня есть два кадра данных с информацией о клиенте:

df1 = pd.DataFrame({'firstname':['jack','john','donald'],
                  'lastname':['ryan','obrien','trump'],
                   'email':['mymail@gmail.com','hismail@gmail.com','email@website.com'],
                   'bank_account':['abcd123','jhkf123','kdlk123']})

print(df1)

  firstname lastname              email bank_account
0      jack     ryan   mymail@gmail.com      abcd123
1      john   obrien  hismail@gmail.com      jhkf123
2    donald    trump  email@website.com      kdlk123


df2 = pd.DataFrame({'firstname':['jack','patrick','barak'],
                  'lastname':['ryan','murphy','obama'],
                   'email':['mymail@gmail.com','some@email.com','other@email.com'],
                   'bank_account':[pd.np.nan]*3})

print(df2)


  firstname lastname             email  bank_account
0      jack     ryan  mymail@gmail.com           NaN
1   patrick   murphy    some@email.com           NaN
2     barak    obama   other@email.com           NaN

Я хочу вставить записи из df2 в df1, но только если они не присутствуют в df1.

Например, мы можем видеть, что jack ryan присутствует в df2 и df1, поэтому я не хочу, чтобы он был вставлен в df1.

primary key в этой ситуации может быть электронным письмом.Если электронная почта существует в df1, не вставляйте запись.

Я экспериментировал и гуглил с pd.concat в последнее время, устанавливая email в качестве индекса и т. Д., И не могу получить желаемый результат, а именно:

  firstname lastname              email  mobile       address bank_account
0      jack     ryan   mymail@gmail.com   12346   main street      abcd123
1      john   obrien  hismail@gmail.com   51234   high street      jhkf123
2    donald    trump  email@website.com   54856   white house      kdlk123
3   patrick   murphy     some@email.com    6548  north street          NaN
4    barack    obama    other@email.com    2135       florida          NaN

В ожидаемом выводе видно, что jack ryan не было добавлено к новому фрейму данных, так как email был проверен перед добавлением данных.

Ответы [ 2 ]

2 голосов
/ 20 сентября 2019

Вам просто необходимо concat, а затем использовать drop-duplicates

pd.concat([df1,df2], ignore_index=True).drop_duplicates('email')

Выход:

      firstname lastname              email  mobile       address bank_account
0      jack     ryan   mymail@gmail.com   12346   main street      abcd123
1      john   obrien  hismail@gmail.com   51234   high street      jhkf123
2    donald    trump  email@website.com   54856   white house      kdlk123
3   patrick   murphy     some@email.com    6548  north street          NaN
4    barack    obama    other@email.com    2135       florida          NaN
1 голос
/ 20 сентября 2019

Вы можете попробовать что-то вроде:

df1_unique = df1['email'].unique()
df1 = df1.append(df2.loc[~df2['email'].isin(df1_unique), :])
df1

Вывод:

    firstname   lastname    email               bank_account
0   jack        ryan        mymail@gmail.com    abcd123
1   john        obrien      hismail@gmail.com   jhkf123
2   donald      trump       email@website.com   kdlk123
1   patrick     murphy      some@email.com      NaN
2   barak       obama       other@email.com     NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...