import pandas as pd
import numpy as np
df1=pd.DataFrame(data=[[39000, 'Санкт-Петербург', '5 мая 02:08', 123545],
[38990, 'Санкт-Петербург', '4 мая 15:54', 9999991],
[25000, 'Новосибирск', '4 мая 17:29', 4577441],
[47990, 'Москва', '4 мая 14:04', 1245366]],
columns=['Цена', 'Город', 'Дата', 'id'])
df2=pd.DataFrame(data=[[20000, 'Красноярск', '1 мая 10:01', 953314],
[38990, 'Санкт-Петербург', '4 мая 15:54', 9999991],
[25000, 'Новосибирск', '4 мая 17:29', 4577441],
[10000, 'Санкт-Петербург', '5 мая 02:08', 123545],
[43990, 'Москва', '4 мая 14:04', 1245366],
[52000, 'Омск', '3 мая 14:10', 543642]],
columns=['Цена', 'Город', 'Дата', 'id'])
df3 = df1.merge(df2, how='outer', on='id', suffixes=('_df1', '_df2'))
idx = np.where(df3['Цена_df1'] == df3['Цена_df2'], True, False)
df3.loc[idx, 'Цена_df2'] = np.nan
idx1 = df3['Город_df1'].isna()
# Почему-то через df3.loc[idx1, ['Город_df1', 'Дата_df1']] = df3.loc[idx1, ['Город_df2', 'Дата_df2']]
df3.loc[idx1, 'Город_df1'] = df3.loc[idx1, 'Город_df2']
df3.loc[idx1, 'Дата_df1'] = df3.loc[idx1, 'Дата_df2']
df3.drop(['Город_df2','Дата_df2'], axis='columns', inplace=True) #удаляем не нужные столбцы
df3
Данный вариант не работает, так как пандас ищет имена 'Город_df2' и 'Дата_df2' в первом срезе, а так как их там банально нет, то ничего не происходит.
В этом можно убедиться, если сделать так:
Назначив в правый срез имена как в первом, пандас найдет их в первом и подменит.
Данный вариант работает, потому что df3.loc[idx1, 'Город_df2'] это уже серия, которая не имеет индекса столбца (названия), поэтому пандас соединяет эти срезы только по индексу строк, которые совпадают в обоих срезах.