使用panda对两个数据帧执行多个合并操作



我有两个数据帧,其中要实现多个操作,例如:

旧_DF

id   col1   col2    col3
-------------------------
1    aaa        
2           bbb     123

新_DF

id   col1   col2    col3
-------------------------
1           xxx      999
2    xxx    kkk 

需要对这些数据帧执行以下操作:

  1. 合并两个数据帧
  2. 仅将旧_DF中的空白(NA(单元格替换为新_DF中相应的值
  3. 两个数据帧中值相矛盾的单元格应在新的数据帧中报告

所需结果:

更新的df

id   col1   col2    col3
-------------------------
1    aaa    xxx     999
2    xxx    bbb     123

conflicts_df

id   col1   col2    col3
-------------------------
2           bbb
2           kkk     

我可以使用.append()方法来连接两个数据帧,我想可以使用.bfil().ffil()方法来填充缺失的值。但我对.bfil().ffil()都不成功。我试过df.groupby('id').apply(lambda x: x.ffill().bfill()).drop_duplicates(),但没有得到想要的结果。此外,我不知道如何执行上述步骤3。有人能帮助解决这个问题吗?

设置:

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'])

使用combine_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的数据帧;新的帧在给定的单元格中具有值&值不同,并从旧的&新使用掩码,其中掩码中的任何行都是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

最新更新