Python 根据给定列中缺少的值,将行从一个数据帧添加到另一个数据帧

Python 根据给定列中缺少的值,将行从一个数据帧添加到另一个数据帧,python,pandas,dataframe,merge,Python,Pandas,Dataframe,Merge,我一直在寻找答案,但找不到。我有两个数据帧,一个是target,另一个是backup,它们都有相同的列。我想做的是查看给定的列,并将backup到target中不在target中的所有行添加到target。最简单的解决方案是: 将熊猫作为pd导入 将numpy作为np导入 目标=pd.DataFrame({ “键1”:[“K1”、“K2”、“K3”、“K5”], “A”:[“A1”、“A2”、“A3”、np.nan], “B”:[“B1”、“B2”、“B3”、“B5”], }) backup=p

我一直在寻找答案,但找不到。我有两个数据帧,一个是
target
,另一个是
backup
,它们都有相同的列。我想做的是查看给定的列,并将
backup
target
中不在
target
中的所有行添加到
target
。最简单的解决方案是:

将熊猫作为pd导入
将numpy作为np导入
目标=pd.DataFrame({
“键1”:[“K1”、“K2”、“K3”、“K5”],
“A”:[“A1”、“A2”、“A3”、np.nan],
“B”:[“B1”、“B2”、“B3”、“B5”],
})
backup=pd.DataFrame({
“键1”:[“K1”、“K2”、“K3”、“K4”、“K5”],
“A”:[“A1”、“A”、“A3”、“A4”、“A5”],
“B”:[“B1”、“B2”、“B3”、“B4”、“B5”],
})
merged=target.copy()
对于backup.key1.unique()中的项:
如果项不在target.key1.unique()中:
merged=pd.concat([merged,backup.loc[backup.key1==item]]
合并.reset_索引(drop=True,inplace=True)
给予

key1AB
0 K1 A1 B1
1 K2 A2 B2
2 K3 A3 B3
3 K5 NaN B5
4 K4 A4 B4
现在,我已经尝试了几种只使用熊猫的方法,但它们都不起作用

  • #不起作用,因为它会创建重复的行,如果删除,则不会删除不同的更新行--请将该行与A或NaN进行比较
    pd.concat([目标,备份])。删除重复项()
    键1 A B
    0 K1 A1 B1
    1 K2 A2 B2
    2 K3 A3 B3
    3 K5 NaN B5
    1 K2 A B2
    3 K4 A4 B4
    4K5A5B5
    
  • #不起作用,因为备份将覆盖目标--NaN中的数据
    pd.合并(目标、备份、how=“right”)
    键1 A B
    0 K1 A1 B1
    1 K2 A B2
    2 K3 A3 B3
    3 K4 A4 B4
    4K5A5B5
    
  • 重要的是,它不是的副本,因为我不想有一个新列,更重要的是,值不是
    target
    中的
    NaN
    ,它们根本不存在。此外,如果我将使用建议用于合并列的内容,
    target
    中的
    NaN
    将替换为
    backup
    中不需要的值

  • 它不是使用熊猫的副本,因为在这种情况下,
    NaN
    备份中的值填充,这是错误的:

  • 目标。先合并(备份)
    键1 A B
    0 K1 A1 B1
    1 K2 A2 B2
    2 K3 A3 B3
    3K5A4 B5
    4K5A5B5
    
  • 最后,
  • target.join(备份,on=[“key1”])
    
    给我一个恼人的印象

    ValueError: You are trying to merge on object and int64 columns. If you wish to proceed you should use pd.concat
    
    我真的不明白,因为两者都是纯字符串,并且

    所以我想问,我错过了什么?我如何使用一些
    pandas
    方法来实现它?非常感谢。

    与已筛选的
    备份
    行一起使用
    目标中不存在的。按键1
    已筛选的in:


    也许您可以在
    df.drop\u duplicates()
    中使用“subset”参数来尝试此操作

    其输出:

      key1    A   B
    0   K1   A1  B1
    1   K2   A2  B2
    2   K3   A3  B3
    3   K5  NaN  B5
    3   K4   A4  B4
    

    嗨,谢谢你的回答。出于某种原因,这在我的数据集上不起作用,它显示了补码(或类似的东西)。我还没有弄明白为什么或者为什么我的MRE没有涵盖这一点,但我想说明一下,以防有人跑得更快。
    pd.concat([target, backup]).drop_duplicates(subset = "key1")
    
      key1    A   B
    0   K1   A1  B1
    1   K2   A2  B2
    2   K3   A3  B3
    3   K5  NaN  B5
    3   K4   A4  B4