热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

pandas基础操作大全之数据合并

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

在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主要异同

  1. 相同点:
    1. 连接方式的枚举相同,即均可以通过how指定连接方式,有left、right、inner、outer四种方式,效果也一样
    2. 在用列标签连接时,均可以通过on设置连接的列标签key
    3. 均可以以列标签或行索引进行连表,只不过默认的方式不一样
      1. merger默认是列标签连接,可通过设置left_index和right_index为True,切换为按照行索引连表
      2. join默认是行索引连表,可通过设置on切换为按照列标签连接
  2. 不同点:
    1. 默认连接轴方向不同,merge默认按照列标签连接,join默认按照行index连接
    2. 可连接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]
 

推荐阅读
  • 这篇文章主要介绍了Python拼接字符串的七种方式,包括使用%、format()、join()、f-string等方法。每种方法都有其特点和限制,通过本文的介绍可以帮助读者更好地理解和运用字符串拼接的技巧。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
author-avatar
埼埼popo_514
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有