Объединение информационного кадра панд с перезаписью столбцов - PullRequest
0 голосов
/ 19 сентября 2018

Какой самый быстрый способ объединения фреймов данных Python таким способом?У меня есть два фрейма данных с аналогичными структурами (оба имеют идентификатор первичного ключа и некоторые столбцы значений).Что я хочу сделать, это объединить два фрейма данных на основе идентификатора.Есть ли способы сделать это на основе операций панд?Как я реализовал это прямо сейчас, как указано ниже:

import pandas as pd

a = pd.DataFrame({'id': [1,2,3], 'letter': ['a', 'b', 'c']})
b = pd.DataFrame({'id': [1,3,4], 'letter': ['A', 'C', 'D']})
a_dict =  {e[id]: e for e in a.to_dict('record')}
b_dict =  {e[id]: e for e in b.to_dict('record')}
c_dict = a_dict.copy()
c_dict.update(b_dict)
c = pd.DataFrame(list(c.values())

Здесь c будет эквивалентно

pd.DataFrame({'id': [1,2,3,4], 'letter':['A','b', 'C', 'D']})

   id letter
0   1      A
1   2      b
2   3      C
3   4      D

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018

Попробуйте это

c = pd.concat([a, b], axis=0).sort_values('letter').drop_duplicates('id', keep='first').sort_values('id')

c.reset_index(drop=True, inplace=True)

print(c)

    id  letter
0   1   A
1   2   b
2   3   C
3   4   D
0 голосов
/ 19 сентября 2018

Один из способов может быть следующим:

  • добавить фрейм данных a к фрейму данных b
  • удалить дубликаты на основе id
  • значений сортировкипри оставшемся на id
  • сбросе индекса и отбрасывании старого индекса

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

import pandas as pd

a = pd.DataFrame({'id': [1,2,3], 'letter': ['a', 'b', 'c']})
b = pd.DataFrame({'id': [1,3,4], 'letter': ['A', 'C', 'D']})

c = b.append(a).drop_duplicates(subset='id').sort_values('id').reset_index(drop=True)

print(c)
0 голосов
/ 19 сентября 2018

combine_first

Если 'id' является вашим первичным ключом, используйте его в качестве индекса.

b.set_index('id').combine_first(a.set_index('id')).reset_index()

   id letter
0   1      A
1   2      b
2   3      C
3   4      D

merge с groupby

a.merge(b, 'outer', 'id').groupby(lambda x: x.split('_')[0], axis=1).last()

   id letter
0   1      A
1   2      b
2   3      C
3   4      D
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...