我有两个数据帧df1
和df2
,它们是从同一个源计算的,但是使用不同的方法,因此大多数值都相同,但有一些差异。现在,我想根据df1
中的值更新df2
。
例如:
df1 = pd.DataFrame({'name':['john','deb','john','deb'], 'col1':[490,500,425,678], 'col2':[456,625,578,789],'col3':['TN','OK','OK','NY']})
name col1 col2 col3
john 490 456 TN
deb 500 625 OK
john 425 578 OK
deb 678 789 NY
df2 = pd.DataFrame({'name':['deb','john','deb','john','deb'], 'col1':[400,490,500,425,678], 'col2':[225,456,625,578,789],'col3':['TN','TN','OK','OK','NY']})
name col1 col2 col3
deb 400 225 TN
john 490 456 TN
deb 500 625 OK
john 425 578 OK
deb 678 789 NY
因此,在这种情况下,.append
应仅追加从df2
到df1
的第一行。因此,只有当df2
中有一个新行({1}}中没有(基于名称和df1
)时,才会添加/更新该列,否则它不会。< / p>
这似乎是col3
应该做的事情。
答案 0 :(得分:12)
有两种方法可以实现你的结果。
我会告诉你们两个。
Concat然后放弃
这应该更加 CPU友好
df3 = pd.concat([df1,df2])
df3.drop_duplicates(subset=['name', 'col3'], inplace=True, keep='last')
此方法可能比外部联接更耗费内存,因为您持有df1
,df2
以及[df1, df2]
(df3
的连接结果在记忆中。
外部联接然后删除
这应该是内存友好。
df3 = df1.merge(df2, on=list(df1), how='outer')
df3.drop_duplicates(subset=['name', 'col3'], inplace=True, keep='last')
进行outer
加入会确保您获得两个数据框的所有条目,但df3
将小于我们使用concat
的情况。
关键字keep='last'
曾是take_last=True