向pandas数据框中添加新行

15
我有两个数据框 df1df2,它们都来自同一数据源,但是使用了不同的方法计算,因此大部分值相同,只有一些差异。现在,我想根据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 中,并且基于名称和 col3 不在 df1 中时,该列才会被添加/更新,否则不会。
这似乎是 concat 应该完成的任务。

1
为什么只能追加那一行?你具体如何决定想要哪些行? - lvc
抱歉,我忘记在df2中插入一行。希望现在更清楚了。col3是一个类别变量,所以如果类别中有新的name,你需要添加。 - msakya
换句话说,您想要连接这两个数据框,然后删除重复项?或者如果涉及来自俄克拉荷马州的Deb的新行 - 比如 deb 1000 2000 OK - 您是否希望删除原始的 deb 500 625 OK 行? - DSM
简单来说,我只想添加一行是唯一的(基于两列)。删除重复项的一个注意事项是如何确保我仅保留df1中的值? - msakya
1个回答

21

有两种方法可以实现你的结果。

  1. 将两个数据帧连接(concat),然后删除重复项
  2. 使用外部连接(outer join)/合并(merge),然后删除重复项

我会为你展示这两种方法。

连接后删除

这应该更加CPU友好

df3 = pd.concat([df1,df2])
df3.drop_duplicates(subset=['name', 'col3'], inplace=True, keep='last')

这种方法可能比外连接更占用内存,因为在某个时刻,您需要将df1df2和两者合并后的结果[df1, df2] (df3)同时存储在内存中。

先进行外连接再删除

这种方式应该更加内存友好

df3 = df1.merge(df2, on=list(df1), how='outer')
df3.drop_duplicates(subset=['name', 'col3'], inplace=True, keep='last')

进行 outer 连接将确保您获得来自两个数据帧的所有条目,但是在使用 concat 的情况下,df3 将会更大。

版本0.15及更早版本说明:

关键字 keep='last' 以前是 take_last=True


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接