我有两个数据框,要实现多种操作,比如。
old_DF
id col1 col2 col3
-------------------------
1 aaa
2 bbb 123
新_DF
id col1 col2 col3
-------------------------
1 xxx 999
2 xxx kkk
需要对这些数据帧进行以下操作。
希望的结果。
更新_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步。有没有人可以帮助解决这个问题?
设置。
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