python pandas数据处理教程之合并与拼接

目录
  • 前言
  • 一、join
    • 1、leftjoin
    • 2、rightjoin
    • 3、innerjoin
    • 4、outjoin
  • 二、merge
  • 三、concat
    • 1、纵向合并
    • 2、横向合并
  • 四、append
    • 1、同结构数据追加
    • 2、不同结构数据追加
    • 3、追加合并多个数据集
  • 五、combine_first
  • 六、update
  • 总结

前言

在许多应用中,数据可能来自不同的渠道,在数据处理的过程中常常需要将这些数据集进行组合合并拼接,形成更加丰富的数据集。pandas提供了多种方法完全可以满足数据处理的常用需求。具体来说包括有join、merge、concat、append等。

一般来说

方法 说明
join 最简单,主要用于基于索引的横向合并拼接
merge 最常用,主要用户基于指定列的横向合并拼接
concat 最强大,可用于横向和纵向合并拼接
append 主要用于纵向追加
combine_first 合并重叠数据,填充缺失值
update 将一个数据集的值更新到另一个数据集

下面就来逐一介绍每个方法

一、join

join主要用于基于索引的横向合并拼接

在介绍pandas的join之前我们来看一下SQL对数据集join的几种模式。如果大家对SQL比较熟悉的话应该对SQL操作数据集进行各种合并拼接印象深刻。SQL中各种JOIN的方法如下:

pandas的join实现了left join、right jion、inner join、out jion常用的4中join方法

来自官网的参数说明:

dataframe.join(other,  # 待合并的另一个数据集
                   on=None,  # 连接的键
                   how='left',   # 连接方式:‘left', ‘right', ‘outer', ‘inner' 默认是left
                   lsuffix='',  # 左边(第一个)数据集相同键的后缀
                   rsuffix='',  # 第二个数据集的键的后缀
                   sort=False)  # 是否根据连接的键进行排序;默认False

我们来看下实例,有两个数据集一个是人员姓名,一个是人员的工资

left=pd.DataFrame(['张三','李四','王五','赵六','钱七'], index=[3,4,5,6,7],columns=['姓名'])
right=pd.DataFrame([13000,15000,9000,8600,10000], index=[3,4,5,6,8],columns=['工资'])

注意,left和right的数据集分别都指定了index,因为join主要用于基于索引的横向合并拼接。

1、left join

left.join(right)  #默认how='left'

jion操作默认是left jion的操作,可以看到left索引为7姓名为钱七,在right中没有索引为7的对应所以显示left的姓名但right的工资为NaN,right中索引为8的数据在left中没有索引为8的,所以没有显示。left join合并left的数据

left join 如下图所示

2、right join

left.join(right,how='right')

右链接合并时可以看到,left的数据集没有索引为8的项,所以索引为8的项显示right数据集的工资数据但姓名为NaN,在left中索引为7的项因为right中不存在,所以没有显示。right join合并right的数据

right join 如下图所示

3、inner join

left.join(right,how='inner')

内链接合并时,可以看到left数据集中的索引为7姓名为钱七因为在right数据集中找不到对应的索引,right数据集中索引为8的在left找不到对应的索引所以内连接合并时索引7和8都没有进行合并,inner join只合并两个数据集共有的数据

inner join 如下图所示

4、out join

left.join(right,how='outer')

外链接合并时,可以看到不管是left中的数据还是right中的数据都进行了合并。right join合并两个数据集中所有的数据。

outer join 如下图所示

join很简单,但是它有局限性,因为它只能根据索引来合并。不能指定键来进行合并。比如我要根据编号和姓名来合并,join就比较难办了。但是pandas提供了merge的方法,可以指定列来进行合并拼接。

二、merge

merge最常用,主要用户基于指定列和横向合并拼接,语法如下:

pd.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)
参数名称 说明
left/right 两个不同的 DataFrame 对象。
on 指定用于连接的键(即列标签的名字),该键必须同时存在于左右两个 DataFrame 中,如果没有指定,并且其他参数也未指定, 那么将会以两个 DataFrame 的列名交集做为连接键。
left_on 指定左侧 DataFrame 中作连接键的列名。该参数在左、右列标签名不相同,但表达的含义相同时非常有用。
right_on 指定左侧 DataFrame 中作连接键的列名。
left_index 布尔参数,默认为 False。如果为 True 则使用左侧 DataFrame 的行索引作为连接键,若 DataFrame 具有多层索引(MultiIndex),则层的数量必须与连接键的数量相等。
right_index 布尔参数,默认为 False。如果为 True 则使用左侧 DataFrame 的行索引作为连接键。
how 要执行的合并类型,从 {‘left’, ‘right’, ‘outer’, ‘inner’} 中取值,默认为“inner”内连接。
sort 布尔值参数,默认为True,它会将合并后的数据进行排序;若设置为 False,则按照 how 给定的参数值进行排序。
suffixes 字符串组成的元组。当左右 DataFrame 存在相同列名时,通过该参数可以在相同的列名后附加后缀名,默认为(’_x’,’_y’)。
copy 默认为 True,表示对数据进行复制。

我们来看下面的数据集,在上面的数据集中left数据集加入了员工的编号,right数据集加入了编号及姓名。索引就按默认的索引。

left=pd.DataFrame([[3,'张三'],[4,'李四'],[5,'王五'],[6,'赵六'],[7,'钱七']],
columns=['编号','姓名'])

right=pd.DataFrame([[3,'张三',13000],[4,'李四',15000],[5,'王五',9000],[6,'赵六',8600],[8,'孙八',10000]],
columns=['编号','姓名','工资'])

pd.merge(left,right)

没有指定连接键,默认用重叠列名,没有指定连接方式,默认inner内连接(取left和right编号和姓名的交集)

和join一样通过how来指定连接方式如:

pd.merge(left,right,how='left')

how的连接方式和join一样支持left、right、inner、outer

merge还可以指定多个列进行合并链接,也就是和SQL一样设置多个关联的列。

pd.merge(left,right,how='outer',on=['编号','姓名'])

如果两个对象的列名不同,可以使用left_on,right_on分别指定,如我们把right数据集的“编码”列标签改成“ID”后如果需要left数据集的"编号"和right数据集的"ID"进行关联

right=pd.DataFrame([[3,'张三',13000],[4,'李四',15000],[5,'王五',9000],[6,'赵六',8600],[8,'孙八',10000]],columns=['ID','姓名','工资'])

pd.merge(left,right,how='outer',left_on='编号',right_on='ID')

虽然说merge已经很强大了,但是pandas愿意给你更多,它提供了concat,可以实现横向和纵向的合并与拼接。也就是说不但实现了SQL中的join还实现了union

三、concat

concat() 函数用于沿某个特定的轴执行连接操作,语法如下:

pd.concat(objs,axis=0,join='outer',join_axes=None,ignore_index=False)
参数名称 说明
objs 一个序列或者是Series、DataFrame对象。
axis 表示在哪个轴方向上(行或者列)进行连接操作,默认 axis=0 表示行方向。
join 指定连接方式,取值为{“inner”,“outer”},默认为 outer 表示取并集,inner代表取交集。
ignore_index 布尔值参数,默认为 False,如果为 True,表示不在连接的轴上使用索引。
join_axes 表示索引对象的列表。

来看具体的例子

left2=pd.DataFrame([[1,'陈一'],[2,'周二']],columns=['编号','姓名'])

1、纵向合并

concat默认纵向拼接,我们要在left1数据集的基础上把left2数据集给合并上去,很简单用concat直接就可以合并。

df=pd.concat([left,left2])

2、横向合并

df_outer=pd.concat([left,right],axis=1,join='outer')#外链接
df_inner=pd.concat([left,right],axis=1,join='inner')#内链接

注意:因为concat的链接和join一样是通过索引来链接合并,并不能指定通过某个特定的列来链接进行合并,所以看到的合并后的数据集left和right的编号和姓名是错位的。

如果要根据编号来关联可以指定编号作为索引再进行横向合并,这样就没有问题了。

left.index=left['编号'].values
right.index=right['编号'].values
df_outer=pd.concat([left,right],axis=1,join='outer')
df_inner=pd.concat([left,right],axis=1,join='inner')

四、append

df.append 可以将其他行附加到调用方的末尾,并返回一个新对象。它是最简单常用的数据合并方式。语法如下:

df.append(self, other, ignore_index=False,verify_integrity=False, sort=False)

其中:

  • other 是它要追加的其他 DataFrame 或者类似序列内容
  • ignore_index 如果为 True 则重新进行自然索引
  • verify_integrity 如果为 True 则遇到重复索引内容时报错
  • sort 进行排序

来看下面的例子:

1、同结构数据追加

将同结构的数据追加在原数据后面,在left数据集后面追加left2数据集,left2的数据集内容如下:

left2=pd.DataFrame([[1,'陈一'],[2,'周二']],columns=['编号','姓名'])
left2

left.append(left2)

2、不同结构数据追加

不同结构数据追加,原数据没有的列会增加,没有对应内容的会为空NaN。

如:left3的数据集列有"编号"、“姓名”、“工资”

left3=pd.DataFrame([[8,'孙八',10000],[9,'何九',15000]],columns=['编号','姓名','工资'])
left3

left.append(left3)

当left后追加left3后的数据集会增加“工资列”,没有对应内容的会为空。

3、追加合并多个数据集

append参数可带数据集列表,可以将多个数据集追加到原数据集

如我们将left2和left3都追加到left

left.append([left2,left3])

五、combine_first

combine_first可用于合并重复数据,用其他数据集填充没有的数据。如一个DataFrame数据集中出现了缺失数据,就可以用其他DataFrame数据集中的数据进行填充。语法格式如下:

combine_first(other) #只有一个参数other,该参数用于接收填充缺失值的DataFrame对象。

如left数据集中没有"工资"的数据,我们可以用right数据集有的数据去填充left数据集中的数据。

left.combine_first(right) #用right去填充left

六、update

update和combine_first比较类似,区别在于:

1、填充合并方式稍有差异

combine_first:如果s1中c的值为空,用s2的值替换,否则保留s1的值

update:如果s2中的值不为空,那么替换s1,否则保留s1的值

2、update是更新原数据,combine_first会返回一个填充后的新数据集,对原数据不做更新。

left.update(right) #用right的数据更新left中的数据。

至此,本文介绍了pandas的多种数据合并与拼接方法,并介绍了每种方法的异同,通过pandas的数据处理可以应付日常数据处理中大部分的数据处理工作。

数据集及源代码见:https://github.com/xiejava1018/pandastest.git

总结

到此这篇关于python pandas数据处理教程之合并与拼接的文章就介绍到这了,更多相关pandas数据合并与拼接内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解pandas数据合并与重塑(pd.concat篇)

    1 concat concat函数是在pandas底下的方法,可以将数据根据不同的轴作简单的融合 pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False) 参数说明 objs: series,dataframe或者是panel构成的序列lsit axis: 需要合并链接的轴,0是行,1是列

  • pandas数据拼接的实现示例

    一 前言 pandas数据拼接有可能会用到,比如出现重复数据,需要合并两份数据的交集,并集就是个不错的选择,知识追寻者本着技多不压身的态度蛮学习了一下下: 二 数据拼接 在进行学习数据转换之前,先学习一些数拼接相关的知识 2.1 join()联结 有关merge操作知识追寻者这边不提及,有空可能后面会专门出一篇相关文章,因为其学习方式根SQL的表联结类似,不是几行能说清楚的知识点: join操作能将 2 个DataFrame 合并为一块,前提是DataFrame 之间的列没有重复: # -*-

  • Pandas 按索引合并数据集的方法

    如下所示: import numpy as np import pandas as pd from pandas import Series,DataFrame 一.merge函数 left1 = DataFrame({'水果':['苹果','梨','草莓'], '价格':[3,4,5], '数量':[9,8,7]}).set_index('水果') right1 = DataFrame({'水果':['苹果','草莓'], '产地':['美国','中国']}) print(left1) pri

  • 用pandas按列合并两个文件的实例

    直接上图,图文并茂,相信你很快就知道要干什么. A文件: B文件: 可以发现,A文件中"汉字井号"这一列和B文件中"WELL"这一列的属性相同,以这一列为主键,把B文件中"TIME"这一列数据添加到A文件中,如果B文件缺少某些行,则空着,最后A文件的行数不变,效果如下: 代码如下: # -*- coding: utf-8 -*- """ Created on Wed Nov 29 16:02:05 2017 @aut

  • pandas数据的合并与拼接的实现

    目录 1. Merge方法 1.1 内连接 1.2 外连接 1.3 左连接 1.4 右连接 1.5 基于多列的连接算法 1.6 基于index的连接方法 2. join方法 3. concat方法 3.1 series类型的拼接方法 3.2 dataframe类型的拼接方法 4. 小结 Pandas包的merge.join.concat方法可以完成数据的合并和拼接,merge方法主要基于两个dataframe的共同列进行合并,join方法主要基于两个dataframe的索引进行合并,concat

  • python pandas数据处理教程之合并与拼接

    目录 前言 一.join 1.leftjoin 2.rightjoin 3.innerjoin 4.outjoin 二.merge 三.concat 1.纵向合并 2.横向合并 四.append 1.同结构数据追加 2.不同结构数据追加 3.追加合并多个数据集 五.combine_first 六.update 总结 前言 在许多应用中,数据可能来自不同的渠道,在数据处理的过程中常常需要将这些数据集进行组合合并拼接,形成更加丰富的数据集.pandas提供了多种方法完全可以满足数据处理的常用需求.具

  • Python Pandas数据处理高频操作详解

    目录 引入依赖 算法相关依赖 获取数据 生成df 重命名列 增加列 缺失值处理 独热编码 替换值 删除列 数据筛选 差值计算 数据修改 时间格式转换 设置索引列 折线图 散点图 柱状图 热力图 66个最常用的pandas数据分析函数 从各种不同的来源和格式导入数据 导出数据 创建测试对象 查看.检查数据 数据选取 数据清理 筛选,排序和分组依据 数据合并 数据统计 16个函数,用于数据清洗 1.cat函数 2.contains 3.startswith/endswith 4.count 5.ge

  • Python Pandas高级教程之时间处理

    目录 简介 时间分类 Timestamp DatetimeIndex date_range 和 bdate_range origin 格式化 Period DateOffset 作为index 切片和完全匹配 时间序列的操作 Shifting 频率转换 Resampling 重新取样 总结 简介 时间应该是在数据处理中经常会用到的一种数据类型,除了Numpy中datetime64 和 timedelta64 这两种数据类型之外,pandas 还整合了其他python库比如  scikits.ti

  • 利用Python pandas对Excel进行合并的方法示例

    前言 在网上找了很多Python处理Excel的方法和代码,都不是很尽人意,所以自己综合网上各位大佬的方法,自己进行了优化,具体的代码如下. 博主也是新手一枚,代码肯定有很多需要优化的地方,欢迎各位大佬提出建议~ 代码我自己已经用了一段时间,可以直接拿去用 主要功能 按行合并 ,即保留固定的表头(如前几行),实现多个Excel相同格式相同名字的表单按纵轴合并: 按列合并. 即保留固定的首列,实现多个Excel相同格式相同名字的表单按横轴合并: 表单集成 ,实现不同Excel中相同sheet的集成

  • python Pandas中数据的合并与分组聚合

    目录 一.字符串离散化示例 二.数据合并 2.1 join 2.2 merge 三.数据的分组和聚合 四.索引 总结 一.字符串离散化示例 对于一组电影数据,我们希望统计电影分类情况,应该如何处理数据?(每一个电影都有很多个分类) 思路:首先构造一个全为0的数组,列名为分类,如果某一条数据中分类出现过,就让0变为1 代码: # coding=utf-8 import pandas as pd from matplotlib import pyplot as plt import numpy as

  • python pandas数据处理之删除特定行与列

    目录 dropna() 方法过滤任何含有缺失值的行 方法一:dropna() 其他参数解析 方法二:替换并删除,Python pandas 如果某列值为空,过滤删除所在行数据 总结 dropna() 方法过滤任何含有缺失值的行 pandas.DataFrame里,如果一行数据有任意值为空,则过滤掉整行,这时候使用dropna()方法是合适的.下面的案例,任意列只要有一个为空数据,则整行都干掉.但是我们常常遇到的情况,是根据一个指标(一列)数据的情况,去过滤行数据,类似Excel里面的过滤漏斗,怎

  • Python 数据处理库 pandas进阶教程

    前言 本文紧接着前一篇的入门教程,会介绍一些关于pandas的进阶知识.建议读者在阅读本文之前先看完pandas入门教程. 同样的,本文的测试数据和源码可以在这里获取: Github:pandas_tutorial. 数据访问 在入门教程中,我们已经使用过访问数据的方法.这里我们再集中看一下. 注:这里的数据访问方法既适用于Series,也适用于DataFrame. 基础方法:[]和. 这是两种最直观的方法,任何有面向对象编程经验的人应该都很容易理解.下面是一个代码示例: # select_da

  • Python 数据处理库 pandas 入门教程基本操作

    pandas是一个Python语言的软件包,在我们使用Python语言进行机器学习编程的时候,这是一个非常常用的基础编程库.本文是对它的一个入门教程. pandas提供了快速,灵活和富有表现力的数据结构,目的是使"关系"或"标记"数据的工作既简单又直观.它旨在成为在Python中进行实际数据分析的高级构建块. 入门介绍 pandas适合于许多不同类型的数据,包括: 具有异构类型列的表格数据,例如SQL表格或Excel数据 有序和无序(不一定是固定频率)时间序列数据.

  • Python 第三方库 Pandas 数据分析教程

    目录 Pandas导入 Pandas与numpy的比较 Pandas的Series类型 Pandas的Series类型的创建 Pandas的Series类型的基本操作 pandas的DataFrame类型 pandas的DataFrame类型创建 Pandas的Dataframe类型的基本操作 pandas索引操作 pandas重新索引 pandas删除索引 pandas数据运算 算术运算 Pandas数据分析 pandas导入与导出数据 导入数据 导出数据 Pandas查看.检查数据 Pand

  • python pandas dataframe 按列或者按行合并的方法

    concat 与其说是连接,更准确的说是拼接.就是把两个表直接合在一起.于是有一个突出的问题,是横向拼接还是纵向拼接,所以concat 函数的关键参数是axis . 函数的具体参数是: concat(objs,axis=0,join='outer',join_axes=None,ignore_index=False,keys=None,levels=None,names=None,verigy_integrity=False) objs 是需要拼接的对象集合,一般为列表或者字典 axis=0 是

随机推荐