Панды, объединяющие фреймы данных, перезаписывают значения на ключ

1

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

Первый dataframe 'df1':

    id      value
0   100010  25
1   100011  22
2   100012  30

Второй dataframe '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
    1. set_index id, 2. pd.concat 3. reset_index 4. drop дубликаты subset = 'id', keep= last . Это оно. Я могу дать вам код, но попробуйте один раз. :)
  • 0
    Dark, не проще ли объединить только там, где indexes отличаются, а не объединить все и удалить дубликаты после? ;)
Показать ещё 1 комментарий
Теги:
pandas
dataframe

2 ответа

1
Лучший ответ

Просто используйте 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
  • 0
    С или без '~'?
  • 0
    @Hoenie с ~ , так что вы получаете индексы в df , которых нет в df2 , и объединяете с остальными индексами в df2
Показать ещё 3 комментария
2

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

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

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

используйте comb_first на 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 лучше

Ещё вопросы

Сообщество Overcoder
Наверх
Меню