настройка:
old_df = pd.DataFrame([
[1, 'aaa', pd.NA, pd.NA],
[2, pd.NA, 'bbb', 123]],
columns=['id', 'col1', 'col2', 'col3'])
new_df = pd.DataFrame([
[1, pd.NA, 'xxx', 999],
[2, 'xxx', 'kkk', pd.NA]],
columns=['id', 'col1', 'col2', 'col3'])
Используйтеcommon_first, чтобы получить updated_df
, установив id
в качестве индекса
old_df = old_df.set_index('id')
new_df = new_df.set_index('id')
updated_df = old_df.combine_first(new_df)
# updated_df outputs:
# (reset the id if necessary)
col1 col2 col3
id
1 aaa xxx 999
2 xxx bbb 123
сгенерируйте фрейм данных masks
с использованием логических логических значений c, проверяя, что и старый, и новый кадры имеют значения в данной ячейке и что значения различаются, и выбираем ячейки как из старого, так и из нового, используя маску, где любая строка в маске имеет значение True
mask = pd.notnull(new_df) & ~old_df.eq(new_df) & pd.notnull(old_df)
conflicts_df = pd.concat([old_df[mask], new_df[mask]]).dropna(how='all')
# conflicts_df outputs
col1 col2 col3
id
2 NaN bbb NaN
2 NaN kkk NaN