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