Pandas中DataFrame数据合并、连接(concat、merge、join)

2023-11-16

最近在工作中,遇到了数据合并、连接的问题,故整理如下,供需要者参考~

 

一、concat:沿着一条轴,将多个对象堆叠到一起

       concat方法相当于数据库中的全连接(union all),它不仅可以指定连接的方式(outer join或inner join)还可以指定按照某个轴进行连接。与数据库不同的是,它不会去重,但是可以使用drop_duplicates方法达到去重的效果。

concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, 
       keys=None, levels=None, names=None, verify_integrity=False, copy=True): 

       pd.concat()只是单纯的把两个表拼接在一起,参数axis是关键,它用于指定是行还是列,axis默认是0。当axis=0时,pd.concat([obj1, obj2])的效果与obj1.append(obj2)是相同的;当axis=1时,pd.concat([obj1, obj2], axis=1)的效果与pd.merge(obj1, obj2, left_index=True, right_index=True, how='outer')是相同的。merge方法的介绍请参看下文。

       参数介绍:

       objs:需要连接的对象集合,一般是列表或字典;

       axis:连接轴向;

       join:参数为‘outer’或‘inner’;

       join_axes=[]:指定自定义的索引;

       keys=[]:创建层次化索引;

       ignore_index=True:重建索引

       举例:

df1=DataFrame(np.random.randn(3,4),columns=['a','b','c','d'])  
  
df2=DataFrame(np.random.randn(2,3),columns=['b','d','a'])  
  
pd.concat([df1,df2])  
  
          a         b         c         d  
0 -0.848557 -1.163877 -0.306148 -1.163944  
1  1.358759  1.159369 -0.532110  2.183934  
2  0.532117  0.788350  0.703752 -2.620643  
0 -0.316156 -0.707832       NaN -0.416589  
1  0.406830  1.345932       NaN -1.874817  

pd.concat([df1,df2],ignore_index=True)  

          a         b         c         d  
0 -0.848557 -1.163877 -0.306148 -1.163944  
1  1.358759  1.159369 -0.532110  2.183934  
2  0.532117  0.788350  0.703752 -2.620643  
3 -0.316156 -0.707832       NaN -0.416589  
4  0.406830  1.345932       NaN -1.874817  

 

二、merge:通过键拼接列

      类似于关系型数据库的连接方式,可以根据一个或多个键将不同的DatFrame连接起来。该函数的典型应用场景是,针对同一个主键存在两张不同字段的表,根据主键整合到一张表里面。

merge(left, right, how='inner', on=None, left_on=None, right_on=None,  
      left_index=False, right_index=False, sort=True,  
      suffixes=('_x', '_y'), copy=True, indicator=False)

     参数介绍:

     left和right:两个不同的DataFrame;

     how:连接方式,有inner、left、right、outer,默认为inner;

     on:指的是用于连接的列索引名称,必须存在于左右两个DataFrame中,如果没有指定且其他参数也没有指定,则以两个DataFrame列名交集作为连接键;

     left_on:左侧DataFrame中用于连接键的列名,这个参数左右列名不同但代表的含义相同时非常的有用;

     right_on:右侧DataFrame中用于连接键的列名;

     left_index:使用左侧DataFrame中的行索引作为连接键;

     right_index:使用右侧DataFrame中的行索引作为连接键;

     sort:默认为True,将合并的数据进行排序,设置为False可以提高性能;

     suffixes:字符串值组成的元组,用于指定当左右DataFrame存在相同列名时在列名后面附加的后缀名称,默认为('_x', '_y');

     copy:默认为True,总是将数据复制到数据结构中,设置为False可以提高性能;

     indicator:显示合并数据中数据的来源情况

     举例:

# 1.默认以重叠的列名当做连接键。
df1=DataFrame({'key':['a','b','b'],'data1':range(3)})    
df2=DataFrame({'key':['a','b','c'],'data2':range(3)})    
pd.merge(df1,df2)   #没有指定连接键,默认用重叠列名,没有指定连接方式  
  
   data1 key  data2  
0      0   a      0  
1      1   b      1  
2      2   b      1  

# 2.默认做inner连接(取key的交集),连接方式还有(left,right,outer),制定连接方式加参数:how=''
pd.merge(df2,df1)  
  
   data2 key  data1  
0      0   a      0  
1      1   b      1  
2      1   b      2                   #默认内连接,可以看见c没有连接上。  
  
pd.merge(df2,df1,how='left')    #通过how,指定连接方式  
 
   data2 key  data1  
0      0   a      0  
1      1   b      1  
2      1   b      2  
3      2   c    NaN  

# 3.多键连接时将连接键组成列表传入,例:pd.merge(df1,df2,on=['key1','key2']
right=DataFrame({'key1':['foo','foo','bar','bar'],  
         'key2':['one','one','one','two'],  
         'lval':[4,5,6,7]})  
left=DataFrame({'key1':['foo','foo','bar'],  
         'key2':['one','two','one'],  
         'lval':[1,2,3]})  
right=DataFrame({'key1':['foo','foo','bar','bar'],  
         'key2':['one','one','one','two'],  
         'lval':[4,5,6,7]})  
pd.merge(left,right,on=['key1','key2'],how='outer')  #传出数组  
   
  key1 key2  lval_x  lval_y  
0  foo  one       1       4  
1  foo  one       1       5  
2  foo  two       2     NaN  
3  bar  one       3       6  
4  bar  two     NaN       7  

# 4.如果两个对象的列名不同,可以分别指定,例:pd.merge(df1,df2,left_on='lkey',right_on='rkey')
df3=DataFrame({'key3':['foo','foo','bar','bar'], #将上面的right的key 改了名字  
         'key4':['one','one','one','two'],  
         'lval':[4,5,6,7]})  
pd.merge(left,df3,left_on='key1',right_on='key3')  #键名不同的连接  
   
  key1 key2  lval_x key3 key4  lval_y  
0  foo  one       1  foo  one       4  
1  foo  one       1  foo  one       5  
2  foo  two       2  foo  one       4  
3  foo  two       2  foo  one       5  
4  bar  one       3  bar  one       6  
5  bar  one       3  bar  two       7  

 

三、join:主要用于索引上的合并

join(self, other, on=None, how='left', lsuffix='', rsuffix='',sort=False):

其参数的意义与merge方法中的参数意义基本一样。

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

Pandas中DataFrame数据合并、连接(concat、merge、join) 的相关文章

  • 如何在cvxpy中编写多个约束?

    我想在 cvxpy 下的优化问题中添加许多约束 在 matlab 中 我可以通过添加一行 subject to 然后使用 for 循环来生成约束 我怎样才能在 cvxpy 中做同样的工作 因为 cvxpy 中没有 服从 概念 有什么建议吗
  • Python:如何删除圆括号内的文本?

    我试过了 但没用 return re sub myResultStats text 建议 thanks 尝试这个 return re sub myResultStats text 括号表示捕获组 因此您必须转义它们
  • 使用python同时播放两个正弦音

    我正在使用 python 来播放正弦音 音调基于计算机的内部时间 以分钟为单位 但我想根据秒同时播放一个音调 以获得和谐或双重的声音 这就是我到目前为止所拥有的 有人能指出我正确的方向吗 from struct import pack fr
  • 将图像转换为二进制流

    我的应用程序有两个方面 一方面我使用 C 来使用 Pleora 的 EBUS SDK 从相机读取帧 当第一次接收到该流时 在将缓冲区转换为图像之前 我能够一次读取 16 位流 以便对每个像素执行一些计算 即每个像素都存在一个 16 位数据块
  • Flask-httpauth: get_password 装饰器如何为 basic-auth 工作?

    我想知道有没有人用过这个烧瓶延伸 https github com miguelgrinberg flask httpauth简化 http basic auth 基本上我不明白这个example https github com migu
  • 在Python中随机化列表[重复]

    这个问题在这里已经有答案了 我想知道是否有一个好方法来 震动 Python 中的项目列表 例如 1 2 3 4 5 可能会被动摇 随机化 3 1 4 2 5 任何顺序都同样可能 from random import shuffle list
  • Python 中 Goto 标签的替代方案?

    我知道我不能使用 Goto 我也知道 Goto 不是答案 我读过类似的问题 但我只是想不出解决我的问题的方法 所以 我正在编写一个程序 你必须在其中猜测一个数字 这是我遇到问题的部分的摘录 x random randint 0 100 I
  • __subclasses__ 没有显示任何内容

    我正在实现一个从适当的子类返回对象的函数 如果我搬家SubClass from base py 没有出现子类 subclasses 它们必须在同一个文件中吗 也许我从来没有直接导入subclass py对Python隐藏子类 我能做些什么
  • 使用 Beautifulsoup 解析时保持 XML 文件的缩进

    我正在使用 BS4 解析 XML 文件并尝试将其写回新的 XML 文件 输入文件
  • 为什么在 python 控制台中对 SparkSession.builder.getOrCreate() 的调用被视为命令行 Spark-submit?

    代替python console我正在尝试创建一个Spark Session 我没有使用pyspark以隔离依赖关系 为什么是spark submit命令行提示并生成错误 NOTE SPARK PREPEND CLASSES is set
  • 包装 C++ Qt 小部件以便在 Python 中与 PySide 一起使用

    在 Python 中使用自定义 Qt 显示小部件包装自定义 C 库以便在基于 PySide 的 QApplication 中使用的最佳方法是什么 C 库是否需要特殊处理才能使用 SWIG 进行包装 封装的 Qt 小部件能否与 PySide
  • 将 Matlab MEX 文件中的函数直接嵌入到 Python 中

    我正在使用专有的 Matlab MEX 文件在 Matlab 中导入一些仿真结果 当然没有可用的源代码 Matlab 的接口实际上非常简单 因为只有一个函数 返回一个 Matlab 结构体 我想知道是否有任何方法可以直接从Python调用M
  • 使用 pythons strftime 显示日期,例如“5 月 5 日”? [复制]

    这个问题在这里已经有答案了 可能的重复 Python 日期顺序输出 https stackoverflow com questions 739241 python date ordinal output 在Python中 time strf
  • 调试 python Web 服务

    我正在使用找到的说明here http www diveintopython net http web services user agent html 尝试检查发送到我的网络服务器的 HTTP 命令 但是 我没有看到按照教程中的建议在控制
  • pip:证书失败,但curl 有效

    我们在客户端安装了根证书 https 连接适用于curl 但如果我们尝试使用pip 它失败 Could not fetch URL https installserver 40443 pypi simple pep8 There was a
  • 没有名为 urllib.parse 的模块(我应该如何安装它?)

    我正在尝试在 CentOS 7 上运行 REST API 我读到 urllib parse is in Python 3 但我使用的是 Python 2 7 5 所以我不知道如何安装此模块 我安装了所有要求 但仍然无法运行该项目 当我寻找
  • 如何从 Selenium 获取元素的属性

    我正在 Python 中使用 Selenium 我想得到 val of a
  • 对 Python 的 id() 感到困惑[重复]

    这个问题在这里已经有答案了 我可以理解以下定义 每个对象都有一个身份 类型和值 对象的身份 一旦创建就永远不会改变 你可能会认为它是 对象在内存中的地址 这is操作员比较身份 两个物体 这id 函数返回一个代表其值的整数 身份 我假设上面的
  • 是否可以使用 Python 中的密码安全地加密然后解密数据?

    我在 python 程序中有一些数据 我想在使用密码写入文件之前对其进行加密 然后在使用它之前读取并解密它 我正在寻找一些可以根据密码进行加密和解密的安全对称算法 这个问题 https stackoverflow com questions
  • 矩阵求逆 (3,3) python - 硬编码与 numpy.linalg.inv

    对于大量矩阵 我需要计算定义为的距离度量 尽管我确实知道强烈建议不要使用矩阵求逆 但我没有找到解决方法 因此 我尝试通过对矩阵求逆进行硬编码来提高性能 因为所有矩阵的大小均为 3 3 我预计这至少会是一个微小的改进 但事实并非如此 为什么

随机推荐

  • CSS文字自动换行

    word break属性 normal 只在允许的断字点换行 浏览器保持默认处理 break word 在长单词或 URL 地址内部进行换行 white space属性 normal 默认 空白会被浏览器忽略 pre 空白会被浏览器保留 其
  • Java编程那些事儿88——文件操作之写文件

    Java编程那些事儿88 文件操作之写文件 陈跃峰 出自 http blog csdn net mailbomb 11 3 1 4 写文件 如前所述 将程序内部的数据输出到程序外部的数据源 应该使用IO类体系中的输出流 在实际的编程中 将程
  • MATLAB设计滤波器之新版filterDesigner使用

    一 引言 本篇内容主要介绍新版Matlab的滤波器设计filterDesigner工具的使用 并以设计两个带通滤波器为使用的例子 使用的MATLAB软件版本为MATLAB R2022a 二 filterDesigner设计滤波器 1 在命令
  • C++责任链模式:Chain of Responsibility Pattern

    当你想要让一个以上的对象有机会能够处理某个请求的时候 就可以使用责任链模式 责任链模式 将请求的发送和接收解耦 让多个接收对象都有机会处理这个请求 将这些接收对象串成一条链 并沿着这条链传递这个请求 直到链上的某个接收对象能够处理它为止 通
  • Ubuntu18.04装Miniconda后终端出现base环境

    在 Ubuntu18 04LTS DELL 台式机中安装 Pytorch 由于没有 GPU 只能下载仅使用 CPU 版的 Pytorch 去 Pytorch 官网按照文档 Start Locally PyTorch 一步步下载相应的环境 P
  • tomcat8下启动 jsp报错

    The method getDispatcherType is undefined for the type HttpServletRequest java lang ClassNotFoundException org apache js
  • PLSQL中的FOR循环

    游标的FOR循环 循环体是查询的表 游标的for循环 PL SQL 语言提供了 游标 FOR 循环语句 自动执行游标的 OPEN FETCH CLOSE 语句和 循环 语句的功能 当进入循环时 游标 FOR 循环语句 自动 打开游标 并提取
  • LCD调试流程

    本来想学的更深入一些再来写这些总结 但想想 边学边写 记录成长过程也挺好的 下面自底向上 了解LCD的整个工作流程 一 LCD的组成结构和各结构的功能 1 背光板模组 提供光的来源 2 上下偏光板 TFT Glass Substrate 液
  • 【C/C++学习笔记】c++ 回调函数

    1 介绍 回调函数就是一个通过函数指针调用的函数 如果你把函数的指针 地址 作为参数传递给另一个函数 当这个指针被用来调用其所指向的函数时 我们就说这是回调函数 回调函数不是由该函数的实现方直接调用 而是在特定的事件或条件发生时由另外的一方
  • Maven自动化构建工具详解

    一 Maven概述 1 使用Maven原因 我们先通过企业开发中的实际需求来看一看哪些方面是我们现有技术的不足 1 第三方Jar包添加 在今天的JavaEE开发领域 有大量的第三方框架和工具可以供我们使用 要使用这些jar包最简单的方法就是
  • win7+ubuntu20.04双系统安装,以及pointnet2_pytorch编译记录

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 win7 ubuntu20 04双系统安装 二 Ubuntu安装相关 1 Anaconda 2 Nvidia Driver 3 编译pointnet2 p
  • SSM框架-SpringMVC详解

    springmvc概述 Springmvc是spring框架的一个模块 spring和springmvc无需中间整合层整合 Springmvc是一个基于mvc的web框架 表现层的三大任务 URL到controller的映射 http请求参
  • 【MySQL】20个经典面试题,全部答对月薪10k+

    欢迎加入QQ群讨论更多内容 群号 835870546 原文链接 http bbs 51cto com thread 1470880 1 html Part2 经典题目 1 MySQL的复制原理以及流程 基本原理流程 3个线程以及之间的关联
  • IntelliJ Idea 常用快捷键列表

    IntelliJ Idea 常用快捷键列表 Alt 回车 导入包 自动修正 Ctrl N 查找类 Ctrl Shift N 查找文件 Ctrl Alt L 格式化代码 Ctrl Alt O 优化导入的类和包 Alt Insert 生成代码
  • c++/c混合编程

    一 前言 代码从编写到能执行之前 需要经过编译 链接阶段 通常 编译每一个单元文件会生成目标文件 然后链接器会把各个目标文件链接起来生成可执行性文件 链接器之所以能把目标文件相互之间链接起来 就是通过查找目标文件中的唯一函数符号 即经过编译
  • 飞行管理计算机哪个公司,波音737-700的FMC(飞行管理计算机的讲解) VLN081

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 DEP ARR 进离场页面 第一行是你的起始机场 左1 右1 XXXX ARR gt 右2 HOLD 等待点设置叶面 等待点必须在航路上设置的一个点 并已经如入到LEGS 左1 XX 点的名称
  • 初识设计模式:单例模式

    设计模式 是一种思想 解决一个问题的方法有很多种 编程实现一个解决方法也有很多种 设计模式是一种针对不同问题 设计适合该问题的代码 在保证解决问题的基础上 还要保证能有好的扩展性 再有新需求的时候可以便捷的添加新模块 而非大动干戈的改变整个
  • cocos2d Sprite混合达到水流动效果

    使用Sprite混合setBlendFunc方式达到流动效果 void MainHomeLayer updateWaterFall float dt static float offset 0 if NULL waterFall water
  • Qt获取CPU编号和硬盘序列号

    windows下执行命令除了用cmd之外 还有个东西叫WMIC 非常强大 可以通过他获取很多信息 包括硬件信息 QString frmMain getWMIC const QString cmd 获取cpu名称 wmic cpu get N
  • Pandas中DataFrame数据合并、连接(concat、merge、join)

    最近在工作中 遇到了数据合并 连接的问题 故整理如下 供需要者参考 一 concat 沿着一条轴 将多个对象堆叠到一起 concat方法相当于数据库中的全连接 union all 它不仅可以指定连接的方式 outer join或inner