将新行添加到其中尚不存在的数据框中

时间:2014-03-25 23:37:54

标签: python python-2.7 pandas

我有两个数据帧df1df2,它们是从同一个源计算的,但是使用不同的方法,因此大多数值都相同,但有一些差异。现在,我想根据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应仅追加从df2df1的第一行。因此,只有当df2中有一个新行({1}}中没有(基于名称和df1)时,才会添加/更新该列,否则它不会。< / p>

这似乎是col3应该做的事情。

1 个答案:

答案 0 :(得分:12)

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

  1. Concat两个数据帧,然后删除重复项
  2. 使用外部联接/合并,然后删除重复项
  3. 我会告诉你们两个。

    Concat然后放弃

    这应该更加 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加入会确保您获得两个数据框的所有条目,但df3将小于我们使用concat的情况。

    版本0.15及更早版本注释:

    关键字keep='last'曾是take_last=True