使用熊猫对两个数据框进行多次合并操作

时间:2020-05-05 15:45:58

标签: python pandas dataframe pandas-groupby

我有两个要执行多个操作的数据框,例如:

old_DF

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

new_DF

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

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

  1. 合并两个数据框
  2. 仅用new_DF中的相应值替换old_DF中的空白(NAs)单元格
  3. 两个数据框中值相矛盾的单元格应在新的数据框中报告

所需结果:

updated_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。有没有人可以帮助解决这个问题?

1 个答案:

答案 0 :(得分:0)

设置:

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的数据帧,检查旧帧和新帧在给定的单元格中均具有值且值是否不同,并使用掩码(在任意行中)从新旧帧中选择单元格面具里的是真

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