我有两个数据帧 df1
和 df2
是从同一来源计算的,但使用不同的方法,因此大多数值相同,但有一些差异。现在,我想根据 df2
中的值更新 df1
。
例如:
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
中有一个新行在 df1
中不存在时(基于名称和 col3
),才会添加该列/已更新,否则不会。
这几乎像是 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的情况
.
版本 0.15 及更早的注意事项:
关键字 keep='last'
曾经是 take_last=True
关于python - 将新行添加到 Pandas 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22648591/