广告
返回顶部
首页 > 资讯 > 后端开发 > Python >pandas实现数据合并的示例代码
  • 959
分享到

pandas实现数据合并的示例代码

2024-04-02 19:04:59 959人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、 concat--数据合并1.1 概述1.2 指定合并的轴方向--axis1.3 指定合并轴另外一个轴标签是否合并--join1.4 指定合并轴原标签是否需要变化--igno

pandas 基础操作大全之数据读取&清洗&分析中介绍了pandas常见的数据处理操作,现在继续对pandas常用的数据合并操作做下介绍,便于大家快速了解,也方便后续需要时快速查询。

一、 concat--数据合并

1.1 概述

#pandas 的 concat函数表达式如下
pd.concat(
    [df1, df2, df3],  #指定需合并的两个或多个Dataframe,各个df的shape可以不同
    axis = 0, #指定合并时,合并的轴方向,默认为0,即行合并,多个df会在纵向进行拼接合并
    join = 'outer', #指定在合并轴方向的另外一个轴方向,标签如何合并,outer指取并集,inner指取交集
    ignore_index = False, #指定是否保留原各个df在合并轴方向上的原有标签,默认False,即保留
    keys = ['a','b','c'], #为合并后的数据,在合并轴方向上指定新的index,便于区分各个合并数据源
    names = ['groupA','groupB'], #为
    verify_integrity = False, #指定是否允许在指定的合并轴方向上,允许存在重复的标签,默认值为False,即允许,当指定为True时,如果有重复,在合并的时候会报错
) 

1.2 指定合并的轴方向--axis

#一般情况下,基本是在行方向将多个DataFrame进行连接合并,组成一个新的DataFrame,便于统一进行处理
#常见的应用场景,比如多个DataFrame可能有部分相同的列,希望连在一起,分析其规律
#df1数据源如下:
    A            B            C
0    0.214326    0.818321    -0.055211
1    -0.941666    2.396083    2.173411
#df2数据源如下:
    A            B
0    0.397919    -0.350948
1    0.147547    -0.172974
pd.concat([df1 , df2], axis=0)  #运算结果如下
    A            B            C
0    -0.663727    1.883112    -0.409361
1    0.874930    -0.120000    0.015474
0    0.380397    -1.088665    NaN
1    -1.623468    0.610855    NaN
 
pd.concat([df1 , df2], axis=1) #运算结果如下
    A            B            C            A            B
0    -0.663727    1.883112    -0.409361    0.380397    -1.088665
1    0.874930    -0.120000    0.015474    -1.623468    0.610855

1.3 指定合并轴另外一个轴标签是否合并--join

#一般直接使用join的默认值,即outer,取并集,此时不会丢弃多个DataFrame的任何列信息
#当然,如果想合并时,最后只留下多个DataFrame相同的列或行标签,则使用inner取交集
#df1数据源如下:
    A            B            C
0    0.214326    0.818321    -0.055211
1    -0.941666    2.396083    2.173411
#df2数据源如下:
    A            B
0    0.397919    -0.350948
1    0.147547    -0.172974
pd.concat([df1 , df2], join = 'outer')  #运算结果如下
    A            B            C
0    -0.663727    1.883112    -0.409361
1    0.874930    -0.120000    0.015474
0    0.380397    -1.088665    NaN
1    -1.623468    0.610855    NaN
 
pd.concat([df1 , df2], join = 'inner')  #运算结果如下
    A            B
0    -0.663727    1.883112
1    0.874930    -0.120000
0    0.380397    -1.088665
1    -1.623468    0.610855

1.4 指定合并轴原标签是否需要变化--ignore_index

#该参数在希望对行进行遍历处理时,会比较有用,因为可以设置忽略合并轴方向之前的index或标签,重新进行生成,就像是一个全新的DataFrame一样
#df2数据源如下:
    A            B            C
0    0.214326    0.818321    -0.055211
1    -0.941666    2.396083    2.173411
#df2数据源如下:
    A            B
0    0.397919    -0.350948
1    0.147547    -0.172974
 
pd.concat([df1,df2],ignore_index=True) #运算结果如下
    A            B            C
0    -0.663727    1.883112    -0.409361
1    0.874930    -0.120000    0.015474
2    0.380397    -1.088665    NaN
3    -1.623468    0.610855    NaN
 
pd.concat([df1,df2],ignore_index=False) #运算结果如下
    A            B            C
0    -0.663727    1.883112    -0.409361
1    0.874930    -0.120000    0.015474
0    0.380397    -1.088665    NaN
1    -1.623468    0.610855    NaN

1.5 指定合并轴方向新的index,便于区分数据--keys

该参数类似于分组的效果

#该参数类似分组的效果,即沿着合并轴方向,按照合并的数据源,进行分组,便于区分合并数据来源
#df1数据源如下:
    A            B            C
0    0.214326    0.818321    -0.055211
1    -0.941666    2.396083    2.173411
#df2数据源如下:
    A            B
0    0.397919    -0.350948
1    0.147547    -0.172974
 
pd.concat([df1,df2],keys=['a','b'])  #运算结果如下
        A            B            C
a    0    -0.663727    1.883112    -0.409361
    1    0.874930    -0.120000    0.015474
b    0    0.380397    -1.088665    NaN
    1    -1.623468    0.610855    NaN

1.6 指定合并轴方向新的index 的含义名称,一般和keys一起使用,让合并后的数据更直观--names

#该参数一般与keys一起使用,比如df1和df2是两个季度前两个月的数据,然后使用concat,将两个季度的合并成一个DataFrame,并且用keys指定每个季度的名称,再用names指定对应的含义
#df1数据源如下:
    A            B            C
0    0.214326    0.818321    -0.055211
1    -0.941666    2.396083    2.173411
#df2数据源如下:
    A            B
0    0.397919    -0.350948
1    0.147547    -0.172974
 
pd.concat([df1,df2],keys=['第一季度','第二季度'],names = ['季度', '月份']) #运行结果如下
                A            B            C
季度        月份            
第一季度    0        -0.663727    1.883112    -0.409361
        1        0.874930    -0.120000    0.015474
第二季度    0        0.380397    -1.088665    NaN
        1        -1.623468    0.610855    NaN

1.7 指定合并时是否允许合并轴上有重复标签--verify_integrity

#该参数只有在需要合并的数据,严格使用index或者列标签来区分数据的唯一性时,设置为True,才有意义
#否则,一般不设置就行,即默认False,此时合并时不会严格要求合并时index或列标签必须不同
#df1数据源如下:
    A            B            C
0    0.214326    0.818321    -0.055211
1    -0.941666    2.396083    2.173411
#df2数据源如下:
    A            B
0    0.397919    -0.350948
1    0.147547    -0.172974
 
pd.concat([df1,df2],verify_integrity=True,axis=1)  #报错,因df1和df2均有A、B列标签
pd.concat([df1,df2],verify_integrity=True,axis=0)  #报错,因为df1和df2均有0、1的index

二、 merge--数据连接

merge类似sql中的连表操作,即通过两个DataFrame共有的列,作为key,将表在横向连接起来,主要用于拓展数据信息,比如多个DataFrame,均只记录了自己关心的完整数据的一部分,希望通过某一共同列,连表,最终形成较为完成的数据信息,是一种非常有用的连接方式

2.1 概述

#merge函数基本表达式如下
pd.merge(
    df1,df2, #指定需要连接的两个DataFrame
    on='A', #指定连接时,以哪个列标签为准,进行连接,一般指定的列标签需要在两个df中均存在
    how='outer', #指定数据如何连接,有outer、inner、right、left四种取值
    
    left_on='A', #如果连接的两个df没有相同的列标签,可以分别指定不同的标签,用指定的两个标签来进行连接,此时需要left_on和right_on 均进行指定
    right_on='B',
 
    left_index=True, #可设置以行index的值连接两个DataFrame,一般比较少用
    right_index=True,
 
    suffixes=('_df1','_df2') #设置如果两个DataFrame有除了指定的on列,还有其他相同列标签时,为进行区分,在各自列后面添加后缀,默认是=('_x','_y')
)

2.2 指定键值列进行连表--on参数

#left_on及right_on用法
#一般用在可能希望作为连接key的列标签一样时
#df1数据源为
    姓名        年龄
0    张三        28
1    李四        31
#df2数据源为
    姓名        性别        职业
0    张三        男        IT
1    李四        女        运营
 
pd.merge(df1 ,df2, on='姓名') #运算结果如下
    姓名        年龄        性别        职业
0    张三        28        男        IT
1    李四        31        女        运营
#以上等同于pd.merge(df1,df2),或者df1.merge(df2)
 
 
#left_on及right_on用法
#一般用在可能希望作为连接key的列标签不一样时,使用
#df1数据源为
    姓名        性别        职业
0    张三        男        IT
1    李四        女        运营
#df2数据源为
    员工姓名    婚姻状况    学历
0    张三        未婚        本科
1    李四        已婚        研究生
pd.merge(df1, df2, left_on='姓名', right_on='员工姓名') #运算结果如下
    姓名        性别        职业        员工姓名        婚姻状况        学历
0    张三        男        IT        张三            未婚            本科
1    李四        女        运营        李四    已        婚            研究生

2.3 指定数据连接方式--how参数

#how参数决定了将如何用on指定的key对两个DataFrame进行连接,主要是比对on指定的两个df的列标签,
#如果取并集,则是outer,即连接后的Df会包含两个df所有的key值;如果取交集,则是inner,即连接后的df只会包含两个df均有的key值
#如果需要保证左边df的key值必须有,右边的不一定,则是left;如果需要保证右边df的key值必须有,左边的不一定,则是right
#df1数据源如下
    姓名        性别        职业
0    张三        男        IT
1    李四        女        运营
#df2数据源如下
    姓名        婚姻状况        学历
0    张三        未婚            本科
1    李四        已婚            研究生
2    王五        未婚            博士
3    麻子        已婚            研究生
pd.merge(df1 , df2, how='outer') #运算结果如下
    姓名        性别        职业        婚姻状况        学历
0    张三        男        IT        未婚            本科
1    李四        女        运营        已婚            研究生
2    王五        NaN        NaN        未婚            博士
3    麻子        NaN        NaN        已婚            研究生
 
pd.merge(df1, df2, how='inner') #运算结果如下
    姓名        性别        职业        婚姻状况        学历
0    张三        男        IT        未婚        本科
1    李四        女        运营        已婚        研究生
pd.merge(df1, df2, how='left') #运算结果如下
    姓名        性别        职业        婚姻状况        学历
0    张三        男        IT        未婚            本科
1    李四        女        运营        已婚            研究生
pd.merge(df1, df2, how='right') #运算结果如下
    姓名        性别        职业        婚姻状况        学历
0    张三        男        IT        未婚            本科
1    李四        女        运营        已婚            研究生
2    王五        NaN        NaN        未婚            博士
3    麻子        NaN        NaN        已婚            研究生

2.4 设置使用行索引作为连接key--left_index及right_index参数

#merge一般用于key为列标签时,对两个df进行链接,类似SQL中的连表操作,不过如果需要,也可以使用行的index作为key进行连表
#left_index、right_index,类似于left_on和right_on,这四个可以left和right两两结合,比如df1的index其实就是df2的列的key,此时便可以使用left_index=True,right_on='B',或者直接对两个df用index进行连表
#df1数据源如下
    姓名        性别        职业
0    张三        男        IT
1    李四        女        运营
#df2数据源如下
    姓名        婚姻状况        学历
0    张三        未婚            本科
1    李四        已婚            研究生
2    王五        未婚            博士
3    麻子        已婚            研究生
pd.merge(df1, df2, left_index=True, right_index=True #运算结果如下
    姓名_x    性别        职业        姓名_y    婚姻状况        学历
0    张三        男        IT        张三        未婚            本科
1    李四        女        运营        李四        已婚            研究生

2.5 设置有相同列时自动加后缀--suffixes

#如果连接的两个df,除了key列,或者on指定的列外,还有相同的列标签,为了进行区分,pd会自动在相同的列标签分别添加后缀,默认是x、y,也可通过suffixes显示指定
#df1数据源
    姓名        性别        职业
0    张三        男        IT
1    李四        女        运营
#df2数据源
    姓名        职业        婚姻状况        学历
0    张三        IT        未婚            本科
1    李四        运营        已婚            研究生
2    王五        产品        未婚            博士
3    麻子        市场        已婚            研究生
pd.merge(df1, df2, on='姓名',how='outer',suffixes=('_表1','_表2')) #运算结果如下
    姓名        性别        职业_表1        职业_表2        婚姻状况        学历
0    张三        男        IT            IT            未婚            本科    
1    李四        女        运营            运营            已婚            研究生
2    王五        NaN        NaN            产品            未婚            博士
3    麻子        NaN        NaN            市场            已婚            研究生

三、 join

join整体功能与merge类似,也与SQL中的join语法功能和表现完全一样,只不过join可以高效的连接多个DataFrame,而merge只能连接两个,相当于join的快捷方式,join连接时默认使用行index进行连接,但也可以指定类似merge使用列标签连表。

3.1 概述

#join函数的使用方法如下
DataFrame.join(
    other,  #指定需要连接的其他df,如果是一个,则直接写df,如果是多个,则可以是多个df组成的列表或元组,如果是多个,则不支持设置on、lsuffix以及sort
    on=None,  #默认以行index连接,也可以指定列标签,如果需要指定多个列,则可以是列表或元组形式
    how='left', #连接的方式,枚举为 left、right、outer、inner,默认是left
    lsuffix=' ', #左df重复列的后缀,只对连接2个df有效,连接多个df如果列标签有重复,则会报错
    rsuffix=' ', #右df重复列的后缀,只对连接2个df有效,连接多个df如果列标签有重复,则会报错
    sort=False #排序,按照字典顺序对结果在连接键上排序。如果为False,连接键的顺序取决于连接类型(关键字)
)

3.2 行索引连接--无重复列标签

#默认join以行索引index连接,如果多个df没有重复的列标签,则可以直接进行连接,无需设置其他参数
#此时,也可以一次性连接多个df,
#df1数据源
    姓名        性别
0    张三        男
1    李四        女
#df2数据源
    职业        婚姻状况
0    IT        未婚
1    运营        已婚
df1.join(df2) #运算结果如下
    姓名        性别        职业        婚姻状况    
0    张三        男        IT        未婚    
1    李四        女        运营        已婚    

3.3 行索引连接--有重复列标签

#当有重复列标签时,必须设置lsuffix和rsuffix参数,否则就会报错
#df1数据源
    姓名        性别
0    张三        男
1    李四        女
#df2数据源
    姓名        职业        婚姻状况
0    张三        IT        未婚
1    李四        运营        已婚    
df1.join(df2, lsuffix='_a', rsuffix='_b') #运算结果如下
    姓名_a    性别        姓名_b    职业        婚姻状况
0    张三        男        张三        IT        未婚
1    李四        女        李四        运营        已婚

3.4 列标签链接--列标签不相同,但内容有相同

#类似merge,如果想链接的两个df,可能列标签没有相同,但是某列标签内容有相同,希望用该列作为Key进行连表,则可以分别设置左右on的key
#df1数据源
    姓名        性别
0    张三        男
1    李四        女
#df2数据源
    员工姓名        职业        婚姻状况
0    张三        IT        未婚
1    李四        运营        已婚
2    王五        运营        已婚
df1.join(df2.set_index('员工姓名'),on='姓名') #运算结果如下
    姓名        性别        职业        婚姻状况
0    张三        男        IT        未婚
1    李四        女        运营        已婚

3.5 列标签链接--列标签有相同,内容有相同

#以列标签连表,就类似merge默认的用法,如果除了on指定的列标签,两个df还有其他相同的列标签,则lsuffix和rsuffix必须设置,否则会报错
#df1数据源
    姓名        性别
0    张三        男
1    李四        女
#df2数据源
    姓名        职业        婚姻状况
0    张三        IT        未婚
1    李四        运营        已婚
2    王五        运营        已婚
df1.join(df2.set_index('姓名'),on='姓名') #运算结果如下
    姓名        性别        职业        婚姻状况
0    张三        男        IT        未婚
1    李四        女        运营        已婚

3.6 列标签链接--列标签和列内容均不相同

此时,无法使用列标签连接两个DataFrame

3.7 join和merge主要异同

相同点:

  • 连接方式的枚举相同,即均可以通过how指定连接方式,有left、right、inner、outer四种方式,效果也一样
  • 在用列标签连接时,均可以通过on设置连接的列标签key
  • 均可以以列标签或行索引进行连表,只不过默认的方式不一样
    • merger默认是列标签连接,可通过设置left_index和right_index为True,切换为按照行索引连表
    • join默认是行索引连表,可通过设置on切换为按照列标签连接

不同点:

  • 默认连接轴方向不同,merge默认按照列标签连接,join默认按照行index连接
  • 可连接DataFrame数量不同,merge只能连接2个,join可一次性连接多个列标签均不相同的DataFrame,如果列标签有相同,则只能连2个

四、 append

该方法主要是对存量的DataFrame添加新的行,或者直接将另外一个DataFrame按0轴(按行)合并到现有的DataFrame上,并且要求两个DataFrame的列数完全相等

该方法在比如需要对多个列数相同的数据进行合并分析时较为有用,不过直接使用pd.concat(df1,df2)也能达到目的,只是append用法可能更为直观些

import pandas as pd
#df1数据源如下
    A            B
0    -0.606787    0.256638
1    -1.333439    -0.335560
#df2数据源如下
    A            B
0    -0.606787    0.256638
1    -1.333439    -0.335560
df1.append(df2)
#运算结果如下:
    A            B
0    0.966491    -0.316075
1    -0.298886    1.016128
0    0.592691    0.478276
1    1.117325    1.294424
 
#其实以上方法,效果等同于concat的默认行为
pd.concat(df1,df2)

五、 assign

该方法主要是对存量的DataFrame添加新的列,并且要求新增的列,对应的Series长度需与存量数据相同

该方法用的比较少,因为如果想增加新的列,有更快捷的方式,此处只是罗列说明

#df源数据如下
    A            B
0    -0.606787    0.256638
1    -1.333439    -0.335560
df.assign(C=[1,2])
#结果如下:
    A            B            C
0    -0.606787    0.256638    1
1    -1.333439    -0.335560    2
 
#以上操作等同于如下操作,并且相对来说更加直观
df['C']=[1,2]

到此这篇关于pandas实现数据合并的示例代码的文章就介绍到这了,更多相关pandas 数据合并内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: pandas实现数据合并的示例代码

本文链接: https://www.lsjlt.com/news/118335.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • pandas实现数据合并的示例代码
    目录一、 concat--数据合并1.1 概述1.2 指定合并的轴方向--axis1.3 指定合并轴另外一个轴标签是否合并--join1.4 指定合并轴原标签是否需要变化--igno...
    99+
    2022-11-11
  • Pandas实现批量拆分与合并Excel的示例代码
    目录前言一、拆分成小表格二、合并excel1.介绍2.代码前言 提示:这里可以添加本文要记录的大概内容: 将一个EXCEL等份拆成多个EXCEL 将多个小EXCEL合并成一个大EXC...
    99+
    2022-11-11
  • pandas实现数据可视化的示例代码
    目录一、概述1.1 plot函数参数1.2 本文用到的数据源说明二、折线图--kind='line'三、柱状图--kind='bar'3.1 各组数据...
    99+
    2022-11-11
  • Pandas实现聚合运算agg()的示例代码
    目录前言1. 创建DataFrame对象2. 单列聚合3. 多列聚合4. 多种聚合运算5. 多种聚合运算并更改列名6. 不同的列运用不同的聚合函数7. 使用自定义的聚合函数8. 方便...
    99+
    2022-11-12
  • C#实现PDF页面合并的示例代码
    目录程序环境代码示例1.从两个PDF文档页面实现页面合并2.在同一个PDF文档实现页面合并本文以C#及vb.net代码为例介绍如何来实现合并PDF页面内容。本文中的合并并非将两个文档...
    99+
    2022-11-13
  • Java实现合并word文档的示例代码
    目录说明实现1.首先定义好主文档2.定义需要追加的文档3. 代码实现4. 成果展示说明 在做项目中,遇到了一种情况,需要将一个小word文档的内容插入到一个大word(主文档)中。 ...
    99+
    2022-11-13
    Java合并word文档 Java合并word Java合并文档
  • Java实现合并多个PDF的示例代码
    这里合并用到了一个itext的包。使用maven直接导入依赖即可。 <dependency> <groupId>com.lowagie</gro...
    99+
    2022-11-12
  • pandas实现按行选择的示例代码
    目录1.自定义行索引2. 按普通索引选择数据2.1 按普通索引选择单行数据2.2 按行索引选择多行数据3.按位置索引选择数据3.2 按位置索引选择多行数据4.选择连续多行数据5.选择...
    99+
    2022-11-12
  • pandas实现滑动窗口的示例代码
    目录介绍示例数据移动平均值移动总和最大值和最小值结论介绍 窗口函数(Window Function)是一种在关系型数据库中使用的函数,通常用于计算某个范围内的数据。在数据分析中,窗口...
    99+
    2023-05-13
    pandas 滑动窗口
  • SpringBoot整合canal实现数据同步的示例代码
    目录一、前言二、docker-compose部署canal三、canal-admin可视化管理四、springboot整合canal实现数据同步五、canal-spring-boot...
    99+
    2022-11-13
  • pandas数据的合并与拼接的实现
    目录1.Merge方法1.1内连接1.2外连接1.3左连接1.4右连接1.5基于多列的连接算法1.6基于index的连接方法2.join方法3.concat方法3.1series类型...
    99+
    2022-11-12
  • pandas中DataFrame数据合并连接的实例分析
    这篇文章主要介绍了pandas中DataFrame数据合并连接的实例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。pandas作者Wes McKinney 在【PYTHO...
    99+
    2023-06-15
  • python实现合并两个有序列表的示例代码
    题目描述 将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 LeetCode原题地址:https://leetcode-cn.com/pr...
    99+
    2022-11-12
  • pandas如何实现数据的合并与拼接
    这篇文章将为大家详细讲解有关pandas如何实现数据的合并与拼接,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Pandas包的merge、join、concat方法可以完成数据的合并和拼接,merge方法...
    99+
    2023-06-21
  • SpringBoot整合Redis实现热点数据缓存的示例代码
    我们以IDEA + SpringBoot作为 Java中整合Redis的使用 的测试环境 首先,我们需要导入Redis的maven依赖 <!-- Redis的maven依赖包 ...
    99+
    2023-03-13
    SpringBoot热点数据缓存 SpringBoot整合Redis缓存
  • openCV实现图像融合的示例代码
    目录1. 概念2. 流程3 代码1. 概念 图像融合: 两幅图片叠加在一起,形成前景背景的效果。 2. 流程 (1)读入要融合的两幅图片。(2)把两幅图片调整到统一大小,方便下一步叠...
    99+
    2022-11-13
  • SpringBoot整合Netty实现WebSocket的示例代码
    目录一、pom.xml依赖配置二、代码2.1、NettyServer 类2.2、SocketHandler 类2.3、ChannelHandlerPool 类2.4、Applicat...
    99+
    2022-11-13
  • SpringBoot整合JDBC、Druid数据源的示例代码
    目录1.SpringBoot整合JDBCTemplate1.1.导入jdbc相关依赖包1.2.yaml配置数据源2.SpringBoot整合DruidDataSource2.1.Dr...
    99+
    2022-11-12
  • Java实现归并排序的示例代码
    目录1.算法理解2.实现代码3.实现效果1.算法理解 参考:图解Java中归并排序算法的原理与实现 2.实现代码 import java.lang.reflect.Array; im...
    99+
    2022-11-13
  • django filters实现数据过滤的示例代码
    常用 当前循环. 作用 ...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作