Приносим извинения, если этот вопрос является дубликатом. Я действительно не могу найти ответ на этот конкретный случай. Возможно ли объединить/объединить два фрейма данных при перезаписи значений в первом фрейме данных, если ключ ('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
Я пробовал объединить, объединить, обновить и объединить все, без успеха. Спасибо за вашу помощь!
Просто используйте 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
~
, так что вы получаете индексы в df
, которых нет в df2
, и объединяете с остальными индексами в df2
РЕДАКТИРОВАТЬ:
Самый простой способ:
>>> 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 лучше
set_index
id, 2.pd.concat
3.reset_index
4. drop дубликатыsubset = 'id', keep= last
. Это оно. Я могу дать вам код, но попробуйте один раз. :)indexes
отличаются, а не объединить все и удалить дубликаты после? ;)