Панды, объединяющие фреймы данных, перезаписывают значения на ключ - PullRequest
0 голосов
/ 23 сентября 2018

Приношу свои извинения, если этот вопрос является дубликатом.Я действительно не могу найти ответ на этот конкретный случай.Можно ли объединить / объединить два кадра данных, перезаписывая значения в первом кадре данных, если ключ ('id') также существует во втором кадре данных?Вроде как команда «INSERT - ON DUPLICATE KEY UPDATE» в SQL.

Первый фрейм данных 'df1':

    id      value
0   100010  25
1   100011  22
2   100012  30

Второй фрейм данных 'df2':

    id      value
0   100012  35
1   100013  36

Слияние фреймов данных приводит к появлению новых столбцов и сохранению старых данных для 'id' '100012':

df3 =  pd.merge(df1, df2, on='id', how='outer')
print(df3)

    id      value_x value_y
0   100010  25.0    NaN
1   100011  22.0    NaN
2   100012  30.0    35.0
3   100013  NaN     36.0

Возможно ли получить требуемый вывод непосредственно из функции слияния?Таким образом, обновляется только «id» «100012» и добавляется новая строка «100013»?

    id      value
0   100010  25
1   100011  22
2   100012  35
3   100013  36

Я пытался объединить , объединить , обновить и объединить_первый , все безуспешно.Спасибо за вашу помощь!

Ответы [ 2 ]

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

РЕДАКТИРОВАТЬ:

Самый простой способ:

>>> df1=df1.set_index('id')
>>> df2=df2.set_index('id')

использовать объединение_первых на df2

>>> df2.combine_first(df1)
       value
id
100010    25
100011    22
100012    35
100013    36

СТАРЫЙ пост:

В качестве альтернативы, вы можете использовать стандартный словарь Python

>>> df1=df1.set_index('id')
>>> df2=df2.set_index('id')

сделать словарь из df1

>>> d = df1.to_dict( 'index' )
>>> d
{'100012': {'value': '30'}, '100010': {'value': '25'}, '100011': {'value': '22'}}

update() с другим словарем для фреймов данных - дублирующимися ключамибудет обновлен полной строкой

>>> d.update( df2.to_dict( 'index' ) )
>>> d
{'100012': {'value': '35'}, '100013': {'value': '36'}, '100010': {'value': '25'}, '100011': {'value': '22'}}

Превратите его обратно в кадр данных:

>>> pd.DataFrame.from_dict( d, 'index' )
       value
100010    25
100011    22
100012    35
100013    36

Если вы хотите сохранить все это в пандах - решение RafaelC лучше

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

Просто используйте pd.concat с индексами, которых нет в индексах df2.Пусть

df  = df.set_index('id')
df2 = df2.set_index('id')

Тогда

>>> merged = pd.concat([df[~df.index.isin(df2.index)], df2]).reset_index()

    id      value
0   100010  25
1   100011  22
2   100012  35
3   100013  36
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...