使用完全外连接连接 pandas 中的两个数据帧

2024-01-10

我在 pandas 中有两个数据框,如下所示。 EmpID 是两个数据帧中的主键。

df_first = pd.DataFrame([[1, 'A',1000], [2, 'B',np.NaN],[3,np.NaN,3000],[4, 'D',8000],[5, 'E',6000]], columns=['EmpID', 'Name','Salary'])
df_second = pd.DataFrame([[1, 'A','HR','Delhi'], [8, 'B','Admin','Mumbai'],[3,'C','Finance',np.NaN],[9, 'D','Ops','Banglore'],[5, 'E','Programming',np.NaN],[10, 'K','Analytics','Mumbai']], columns=['EmpID', 'Name','Department','Location'])

我想用 EmpID 连接这两个数据框,以便

  1. 如果存在并且键匹配,一个数据框中的缺失数据可以用另一表中的值填充
  2. 如果存在带有新键的观察结果,则应将它们附加到结果数据框中

我使用下面的代码来实现这一点。

merged_df = pd.merge(df_first,df_second,how='outer',on=['EmpID'])

但是这段代码给了我我不想要的重复列,所以我只使用两个表中的唯一列进行合并。

ColNames = list(df_second.columns.difference(df_first.columns))
ColNames.append('EmpID')
merged_df = pd.merge(df_first,df_second,how='outer',on=['EmpID'])

现在我没有得到重复的列,但在键匹配的观察中也没有得到价值。

如果有人能帮助我,我将非常感激。

问候, 凯拉什·内吉


看来你需要combine_first http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.combine_first.html with set_index http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.set_index.html用于通过列创建的索引进行匹配EmpID:

df = df_first.set_index('EmpID').combine_first(df_second.set_index('EmpID')).reset_index()
print (df)
   EmpID   Department  Location Name  Salary
0      1           HR     Delhi    A  1000.0
1      2          NaN       NaN    B     NaN
2      3      Finance       NaN    C  3000.0
3      4          NaN       NaN    D  8000.0
4      5  Programming       NaN    E  6000.0
5      8        Admin    Mumbai    B     NaN
6      9          Ops  Banglore    D     NaN
7     10    Analytics    Mumbai    K     NaN

EDIT:

对于某些列的顺序需要reindex http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.reindex.html:

#concatenate all columns names togetehr and remove dupes
ColNames = pd.Index(np.concatenate([df_second.columns, df_first.columns])).drop_duplicates()
print (ColNames)
Index(['EmpID', 'Name', 'Department', 'Location', 'Salary'], dtype='object')

df = (df_first.set_index('EmpID')
      .combine_first(df_second.set_index('EmpID'))
      .reset_index()
      .reindex(columns=ColNames))
print (df)
   EmpID Name   Department  Location  Salary
0      1    A           HR     Delhi  1000.0
1      2    B          NaN       NaN     NaN
2      3    C      Finance       NaN  3000.0
3      4    D          NaN       NaN  8000.0
4      5    E  Programming       NaN  6000.0
5      8    B        Admin    Mumbai     NaN
6      9    D          Ops  Banglore     NaN
7     10    K    Analytics    Mumbai     NaN
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用完全外连接连接 pandas 中的两个数据帧 的相关文章

随机推荐

  • 如何在 Obj-C 类别中“伪造”ivars (iPhone)

    Update iPhone OS 3 1 有关联的对象 然而 iPhone 模拟器却没有 如果您想在模拟器中测试关联的对象代码 您应该提交错误 请参阅我的问题here https stackoverflow com questions 19
  • 最接近的 3 点组

    是否有一种已知的 有效的算法来查找最接近的组three云中的点 这类似于最近点对问题 http en wikipedia org wiki Closest pair of points problem但我正在寻找三点而不是两点 Edit 最
  • 导入路径 - 正确的方法?

    我知道有很多类似或相同的问题 但我仍然无法理解 找到使用模块的正确方法 Python 是我最喜欢的语言 除了使用导入之外 我喜欢其中的所有内容 递归导入 当您尝试引用尚不存在的名称时 导入路径等 所以 我有这样的项目结构 my projec
  • 类的 += 运算符的规范形式

    我知道尽可能多地使用非成员非友元类的接口是个好主意 而且我刚刚意识到 对于我的 3D 矢量类 Vector3 我可以移动 等运算符从类中删除 只留下构造函数和复制赋值运算符 问题是 这个运算符应该是什么样子 我见过许多其他运算符的规范形式并
  • 列表内部或外部的序言对有什么用

    我在 SWI PL 文档中多次遇到键值对 但无法获得有关它们的详细信息 这是序言中的标准内容还是只是 swi pl 的扩展 主要在这里找到 http www swi prolog org pldoc doc for object keyso
  • 调用带有返回值的存储过程

    我正在尝试从我的 C Windows 应用程序调用存储过程 该存储过程正在 SQL Server 2008 的本地实例上运行 我可以调用该存储过程 但无法从该存储过程检索值 该存储过程应该返回序列中的下一个数字 我在网上做了研究 我见过的所
  • 如何在 Swift 中将 CGRect 相互组合

    我想知道是否有任何方法可以将一个 CGRect 与另一个 CGRect 组合起来以获得一个新的 CGRect swift 是否有任何预设功能来执行此操作 或者是否有其他方法可以实现此目的 let rect1 CGRect x 0 y 0 w
  • 为什么这个交换函数调用不明确? [复制]

    这个问题在这里已经有答案了 我想使用模板交换两个数字 但为什么会这样 swap x y 给出一个错误作为不明确的调用 include
  • Python-3 和字符串编码中的 \x Vs \u Vs \U 以及原因

    为什么 Python 3 中有不同的面向字节的字符串表示形式 使用单一表示而不是多个表示还不够吗 对于打印字符串的 ASCII 范围编号 显示以以下开头的序列 x In 56 chr 128 Out 56 x80 在不同的数字范围内 Pyt
  • 阻止 EBS Linux 2 (Node.js) 尝试执行 npm install?

    我正在尝试在 Elastic Beanstalk 上的 AWS Linux 2 上运行节点应用程序 并且需要使用纱线安装依赖项 如果您尝试使用 npm 而不是纱线来安装依赖项 我的 Node 应用程序会导致错误 我已经想通了如何在 plat
  • 通过XPath获取tr中特定td的索引

    我的表中有 thead 和 tbody Thead 包含几个 s 每个都有一个 id 我需要通过 id 在 thead 中查找 td 的索引 然后在 tbody 中通过索引查找 table thead tr td td td td find
  • 如何决定spring kafka设置的并发数?

    我正在使用 KafkaListener 注释编写一个 kafka 消费者 我知道有一种方法可以使用 ConcurrentKafkaListenerContainerFactory 中的方法增加来自不同分区的并发 kafka 消费者的数量 e
  • 如何更改TWebBrowser中的字体?

    这个问题与 在 TWebBrowser 中加载字符串 HTML 代码 的最佳方法是什么 https stackoverflow com questions 39773033 which is the best way to load a s
  • Angular2:如何绑定以选择多个

    我可以使用绑定ngModel对于单个选择 但我想将一个数组绑定到多个选定的选项 当我尝试这样做时 我收到错误 在 myModelProperty 中找不到不同的支持对象 xxx My Code
  • 删除“.”之后的部分字符串

    我正在使用 NCBI 参考序列登录号 例如变量a a lt c NM 020506 1 NM 020519 1 NM 001030297 2 NM 010281 2 NM 011419 3 NM 053155 2 要从 biomart 包中
  • 如何修改请求的http header; C# 中的网络参考

    我正在创建一个使用 Web 服务的 NET 应用程序 我需要在对该 Web 服务的请求中将连接 http 标头设置为 关闭 我已经在谷歌上搜索了一天 但没有找到任何有用的东西 我最大的努力是下面的代码 它尝试重写 GetWebRequest
  • 开关与切换

    我正在尝试决定是否使用开关或切换来设置闹钟 我是我的 Android 应用程序 对 android 相当陌生 不知道或不太理解框架工作的所有来龙去脉 选择通过切换开关触发警报 反之亦然 会有什么缺点 android框架中有可用的滑动切换吗
  • Visual Studio 命令栏“名称”

    在 Visual Studio 2010 中 您可以创建的唯一选项是 菜单栏 上 工具 下的命令栏 在某些情况下 我想知道如何将命令栏放置在标准栏上 或者在右键单击项目文件时找到 Example Microsoft VisualStudio
  • 如何递归调用 WriteJson?

    我使用 Json Net 当我序列化一个Department2对象和WriteJson 被调用我希望它被递归地调用每个Telephone2像我一样的物体ReadJson 我怎么做 using System using Newtonsoft
  • 使用完全外连接连接 pandas 中的两个数据帧

    我在 pandas 中有两个数据框 如下所示 EmpID 是两个数据帧中的主键 df first pd DataFrame 1 A 1000 2 B np NaN 3 np NaN 3000 4 D 8000 5 E 6000 column