使用pandas对两个数据帧进行多次合并操作。

问题描述 投票:0回答:1

我有两个数据框,要实现多种操作,比如。

old_DF

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

新_DF

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

需要对这些数据帧进行以下操作。

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

希望的结果。

更新_df

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

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

python pandas dataframe pandas-groupby
1个回答
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 使用布尔逻辑,检查旧的& 新的框架在给定的单元格中是否有值& 值是否不同,并使用掩码从旧的& 新的单元格中选取,掩码中的任何一行都是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
© www.soinside.com 2019 - 2024. All rights reserved.