pandas DataFrame 连接/更新(“upsert”)?

2024-05-21

我正在寻找一种优雅的方法将一个 DataFrame 中的所有行附加到另一个 DataFrame (两个 DataFrame 具有相同的索引和列结构),但如果两个 DataFrame 中出现相同的索引值,请使用第二个数据中的行框架。

因此,举例来说,如果我从以下内容开始:

df1:
                    A      B
    date
    '2015-10-01'  'A1'   'B1'
    '2015-10-02'  'A2'   'B2'
    '2015-10-03'  'A3'   'B3'

df2:
    date            A      B
    '2015-10-02'  'a1'   'b1'
    '2015-10-03'  'a2'   'b2'
    '2015-10-04'  'a3'   'b3'

我希望结果是:

                    A      B
    date
    '2015-10-01'  'A1'   'B1'
    '2015-10-02'  'a1'   'b1'
    '2015-10-03'  'a2'   'b2'
    '2015-10-04'  'a3'   'b3'

这类似于我认为在某些 SQL 系统中所谓的“upsert”——更新和插入的组合,从某种意义上说,来自的每一行df2是 (a) 用于更新现有行df1如果行键已存在于df1,或 (b) 插入df1如果行键尚不存在,则在最后。

我想出了以下内容

pd.concat([df1, df2])     # concat the two DataFrames
    .reset_index()        # turn 'date' into a regular column
    .groupby('date')      # group rows by values in the 'date' column
    .tail(1)              # take the last row in each group
    .set_index('date')    # restore 'date' as the index

这似乎有效,但这依赖于每个 groupby 组中的行顺序始终与原始 DataFrame 相同,我还没有检查过,并且看起来令人不快地复杂。

有谁有更直接的解决方案的想法吗?


一种解决方案是串联df1有新行df2(即索引不匹配的地方)。然后用来自的值更新值df2.

df = pd.concat([df1, df2[~df2.index.isin(df1.index)]])
df.update(df2)

>>> df
             A   B
2015-10-01  A1  B1
2015-10-02  a1  b1
2015-10-03  a2  b2
2015-10-04  a3  b3

EDIT:根据@chrisb的建议,可以进一步简化如下:

pd.concat([df1[~df1.index.isin(df2.index)], df2])

谢谢克里斯!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pandas DataFrame 连接/更新(“upsert”)? 的相关文章

随机推荐

  • 为什么 cordova.file.documentsDirectory 为空?

    我正在尝试使用 cordova plugin file transfer 在http ngcordova com docs plugins fileTransfer http ngcordova com docs plugins fileT
  • 如何使用RStudio用Stata命令编写RMarkdown文件?

    我的问题已在标题中解释 我尝试编译一个示例 Rmd 我在这里找到 http www ssc wisc edu hemken Stataworkshops Stata 20and 20R 20Markdown http www ssc wis
  • matplotlib 和地理数据图的纵横比

    我处理地理信息并使用以下方式呈现结果 matplotlib 所有输入都是纬度 经度 度 我转换成 x y 米 用于我的计算 我在中展示了我的结果 纬度 经度 问题是获得图形的纵横比 右 所有图表都太宽 是否有标准程序来设置 正确的纵横比 这
  • 任何第三方都可以从我的项目加载嵌入式资源吗?

    请参考我的一篇之前的问题 https stackoverflow com questions 14681364 issues passing data from dll to application 我问的是如何从 DLL 加载已编译的资源
  • jquery:$().animate() 不是函数

    我已经做了很多搜索 但无法找到我的问题的答案 所以这里是 我正在尝试创建一个滑出切换菜单本教程 http alijafarian com jquery horizontal slideout menu 我收到一个错误slideoutMenu
  • rpart 决策树中的 rel 误差和 x 误差有什么区别? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个来自 UCI 机器学习数据库的纯分类数据框https archive ics uci edu ml datasets Diabet
  • Netbeans 自动完成功能停止工作?

    我使用的是 Netbeans 6 9 1 一切都很好 但是突然间 它停止检测对代码所做的任何更改 例如新变量 函数等 如果我尝试重构 重命名变量 例如按 CTRL R 它说 重构在此上下文中不可用 如果重要的话 它在 PHP 项目中 有任何
  • JSON 序列化对象在多处理调用时出现错误 - TypeError: XXX 对象不可调用错误

    我正在使用 JSON 序列化器辅助函数来轻松访问字典 基本上以 JSON 形式接收 对象 jsondict py Utilities for working with JSON and json like structures deeply
  • 如何使用 C# 在 xsd 文件中创建数据表

    我需要通过在 xsd 文件中编写代码来创建数据表 而不是通过在 xsd 文件中使用 exixting 数据表 右键单击 xsd 文件 添加 数据表 但我不想使用这个 我想编写一些代码来创建数据表 我不知道解决这个问题 请帮助解决这个问题 谢
  • Google App Engine NDB 祖先查询不起作用

    我正在尝试执行以下查询 query Comment query ancestor userKey ndb OR Comment modifiedDate gt lastSyncDate Comment activityDate gt las
  • 如何格式化整数以仅具有所需的大小?

    我一直在尝试以下代码 program hello write i9 10 end program hello 并改变格式字符串 尝试使写入输出的字符串大小恰好满足表示整数所需的大小 但到目前为止我无法管理它 如何在 Fortran 中编写
  • Java单例内部类

    我知道Java中单例的概念 我在 Java 中创建单例作为内部类时遇到问题 问题发生在持有者身上 public class NormalClass private class Singleton private static Singlet
  • Python:Urllib2 和 OpenCV

    我有一个程序 可以将图像保存在本地目录中 然后从该目录中读取图像 但我不想保存图像 我想直接从url读取它 这是我的代码 import cv2 cv as cv import urllib2 url http cache2 allposte
  • 线程输出到 GUI 文本字段

    我试图在 GUI 的 TextField 中输出 但我得到的只是线程信息 这只是完整代码的一小部分 但完整版本也有同样的问题 完整版本有 5 个不同的线程同时运行 任何帮助或建议将不胜感激 public class O21 implemen
  • WordPress 插件滑块革命错误

    我无法摆脱以下错误 我激活插件后出现错误 Slider Revolution error could not unzip into the revslider public assets folder please make sure th
  • 使用 PyCharm 用海龟(python)绘图

    我正在运行最新的 PyCharm Pro 版本并尝试从临时文件运行以下代码 但它似乎不起作用 import turtle wn turtle Screen alex turtle Turtle alex forward 150 alex l
  • 无法删除 Microsoft Access 2003 中的主 -> 子子表单链接

    我在删除访问子报表数据表单中的主 gt 子链接字段时遇到问题 我尝试了各种方法来删除它们 使用子报表的属性窗口以及链接向导 我还从数据库中删除了子报表 然后将现有对象重新导入到新的访问实例中 一旦我重新添加子表单并将其命名为相同的名称 链接
  • 删除 Git 存储库,但保留所有文件

    在我使用 Linux 的过程中的某个时刻 我决定将我的主目录中的所有内容都放入源代码管理中是个好主意 我不是在问这是否是一个好主意 我是在问如何撤销它 删除存储库的原因是我最近安装了 Oh My Zsh 而且我非常喜欢它 问题是我的主目录有
  • 将对象列表添加到 ef 中的上下文

    是否可以在不使用 foreach addObject 的情况下将对象列表添加到实体框架中的 Context 感谢帮助 从 EntityFramework 6 开始 您可以使用DbSet AddRange 方法 IEnumerable htt
  • pandas DataFrame 连接/更新(“upsert”)?

    我正在寻找一种优雅的方法将一个 DataFrame 中的所有行附加到另一个 DataFrame 两个 DataFrame 具有相同的索引和列结构 但如果两个 DataFrame 中出现相同的索引值 请使用第二个数据中的行框架 因此 举例来说