【问题标题】:Add new rows to a pandas dataframe向 pandas 数据框添加新行
【发布时间】:2014-05-04 02:57:02
【问题描述】:

我有两个数据框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 应该做的事情。

【问题讨论】:

  • 为什么应该只附加该行?具体来说,您如何决定需要哪些行?
  • 对不起,我忘了在 df2 中插入一行。希望这很清楚。 col3 是一个类别变量,所以类别中是否有新的name,您可以追加。
  • 换一种说法:你想连接两个帧然后删除重复的?或者,如果有涉及来自俄克拉荷马州的 Deb 的新行——比如 deb 1000 2000 OK——您是否要删除原来的 deb 500 625 OK 行?
  • 简单地说,我只想添加一个唯一的行(基于两列)。删除重复项的一个警告是,我如何确保仅保留 df1 的值?

标签: python python-2.7 pandas


【解决方案1】:

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

  1. 连接两个数据帧,然后删除重复项
  2. 使用外部联接/合并,然后删除重复项

我会告诉你两个。

连接然后丢弃

这应该更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

【讨论】:

    猜你喜欢
    • 2021-06-20
    • 1970-01-01
    • 2017-11-16
    • 2019-03-21
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 2023-03-22
    相关资源
    最近更新 更多