公众号:尤而小屋
作者:Peter
编辑:Peter
图解pandas数据合并:concat+join+append
在上一篇文章中介绍过pandas中最为常用的一个合并函数merge的使用,本文中介绍的是另外3个与合并操作相关的函数:
concat
join
append
![](https://i-blog.csdnimg.cn/blog_migrate/c2e172cc4fd69af4d654c8eb14e695da.jpeg)
Pandas连载
本文是Pandas数据分析库的第15篇,欢迎阅读:
![](https://i-blog.csdnimg.cn/blog_migrate/fce36e2e1ce48d7bcf1ac230fb130eeb.jpeg)
模拟数据
首先是模拟几份不同的数据:
import pandas as pd
import numpy as np
![](https://i-blog.csdnimg.cn/blog_migrate/6ac9a0a3966edfab90f2cf8053f95e56.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/023132b583b6c20aa140138ddf6f62fa.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/beaded26d3599d58df4c382f8a344066.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/a36fc462310b2245fade9657904f0873.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/7ee078e1ce7a50ff32b12220fb66e2d5.jpeg)
concat
concat也是一个常用的合并函数,下面通过具体例子来介绍它的使用。
参数
pandas.concat(objs, # 合并对象
axis=0, # 合并方向,默认是0纵轴方向
join='outer', # 合并取的是交集inner还是并集outer
ignore_index=False, # 合并之后索引是否重新
keys=None, # 在行索引的方向上带上原来数据的名字;主要是用于层次化索引,可以是任意的列表或者数组、元组数据或者列表数组
levels=None, # 指定用作层次化索引各级别上的索引,如果是设置了keys
names=None, # 行索引的名字,列表形式
verify_integrity=False, # 检查行索引是否重复;有则报错
sort=False, # 对非连接的轴进行排序
copy=True # 是否进行深拷贝
)
默认情况
默认情况是直接在纵向上进行合并
![](https://i-blog.csdnimg.cn/blog_migrate/3a0125cc9f5e8327723882249197be08.jpeg)
axis
指定合并的方向
![](https://i-blog.csdnimg.cn/blog_migrate/5fdbee0025af6e2acc503510fe640c96.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/6659b14d2b70c49a677ee6bfd62daea4.jpeg)
如果某个数据框中不存在,则会显示为NaN:
![](https://i-blog.csdnimg.cn/blog_migrate/462fd6caa58ede46ab58ef498b5d40eb.jpeg)
根据实际数据调整合并的方向,默认是axis=0
某个数据库中不存在的数据,用NaN代替
参数ignore_index
是否保留原表索引,默认保留,为 True 会自动增加自然索引。
![](https://i-blog.csdnimg.cn/blog_migrate/c91d7575f08a8d63db7d021abee7fab4.jpeg)
参数join
指定取得交集inner还是并集outer,默认是并集outer
![](https://i-blog.csdnimg.cn/blog_migrate/e4220c21a5bca80b475c0ac6241d03a6.jpeg)
df3和df4只有地址这个字段是相同的,所以保留了它,其他的舍弃:
![](https://i-blog.csdnimg.cn/blog_migrate/4c4c8747a8dac463867c47f02a52d637.jpeg)
参数keys
![](https://i-blog.csdnimg.cn/blog_migrate/c325c01985cf25609292bf65088e7b48.jpeg)
当我们设置了索引重排(ignore_index=True),keys参数就无效啦
![](https://i-blog.csdnimg.cn/blog_migrate/54d94db6aa058453bb7ff694408ef954.jpeg)
参数name
指定每个层级索引的名字
![](https://i-blog.csdnimg.cn/blog_migrate/36dc055a4f2a421aa600e811dd34fd2a.jpeg)
我们可以检查下df6的索引,发现是层级索引:
![](https://i-blog.csdnimg.cn/blog_migrate/c716339856d0628e477a3af92808f534.jpeg)
合并多个DataFrame
同时合并df1、df2、df5
pd.concat([pd.concat([df1,df2],axis=0,ignore_index=True),df5],axis=1)
![](https://i-blog.csdnimg.cn/blog_migrate/a2b30b4ec027a3b64ce4e8304f6c4aa2.jpeg)
分两步来实现:先合并df1、df2,将得到的结果和df5合并
![](https://i-blog.csdnimg.cn/blog_migrate/c27955e2dcdb4d095c3904ff0f6f4ee6.jpeg)
join
参数
来自官网的参数说明:
dataframe.join(other, # 待合并的另一个数据框
on=None, # 连接的键
how='left', # 连接方式:‘left’, ‘right’, ‘outer’, ‘inner’ 默认是left
lsuffix='', # 左边(第一个)数据框相同键的后缀
rsuffix='', # 第二个数据框的键的后缀
sort=False) # 是否根据连接的键进行排序;默认False
模拟数据
为了解释join的操作,再模拟下数据:
![](https://i-blog.csdnimg.cn/blog_migrate/7a75482833ba586e133e7409e99e6c47.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/d3bf1720029d4d3bbbea7275fb832704.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/3f7f342ff6c64d8f85002a02526578c7.jpeg)
参数 lsuffix、rsuffix
功能是为了添加指定的后缀
![](https://i-blog.csdnimg.cn/blog_migrate/906dde41b6ec372f27133c04bcfdf9d6.jpeg)
如果不指定的话,会报错:
![](https://i-blog.csdnimg.cn/blog_migrate/980aa96d17658f08e44436569775a7df.jpeg)
参数how
how参数默认是left,保留左边的全部字段。右边不存在的数据用NaN
![](https://i-blog.csdnimg.cn/blog_migrate/4c5300d4c03f08d23ff7431e5dc7f7b2.jpeg)
改成right之后,保留右边的全部数据:
![](https://i-blog.csdnimg.cn/blog_migrate/1ac63f2f08bfcbb9e1d344ffe6cdb3d5.jpeg)
可以在默认的参数结果中,name字段被分成了name_left和name_right,如何进行字段的合并呢???
先把键当做行索引
通过join合并
通过reset_index()重新设置索引
![](https://i-blog.csdnimg.cn/blog_migrate/28d5b2d1d252792db7ede4a733ee280a.jpeg)
合并两个数据:
![](https://i-blog.csdnimg.cn/blog_migrate/2f057c2dadfb80ebf9e425edcd7fb817.jpeg)
最后进行索引重置的功能:
![](https://i-blog.csdnimg.cn/blog_migrate/ebe4ee528afb059f0b9ca316b03681b3.jpeg)
还有一种更为简便的方法:
![](https://i-blog.csdnimg.cn/blog_migrate/488bcadf26c3d5e695cb32c040b070f6.jpeg)
合并多个DataFrame
利用join来实现多个DataFrame的合并:
![](https://i-blog.csdnimg.cn/blog_migrate/e3fde0f2a74e7c5a7bfd8e83da771096.jpeg)
如果我们想要用merge函数来实现呢?
使用how="outer",保留全部字段的数据信息
![](https://i-blog.csdnimg.cn/blog_migrate/4ff245afdc034aa71c58d1f0b68f541b.jpeg)
append
字面意思是“追加”。向dataframe对象中添加新的行,如果添加的列名不在dataframe对象中,将会被当作新的列进行添加
参数
DataFrame.append(other,
ignore_index=False,
verify_integrity=False,
sort=False)
参数解释:
other:待合并的数据。可以是pandas中的DataFrame、series,或者是Python中的字典、列表这样的数据结构
ignore_index:是否忽略原来的索引,生成新的自然数索引
verify_integrity:默认是False,如果值为True,创建相同的index则会抛出异常的错误
sort:boolean,默认是None。如果self和other的列没有对齐,则对列进行排序,并且属性只在版本0.23.0中出现。
模拟数据
![](https://i-blog.csdnimg.cn/blog_migrate/61dfcfa956c1e27d6ed97698fbaa36d4.jpeg)
添加不同类型数据
1、Python字典
![](https://i-blog.csdnimg.cn/blog_migrate/968042c8d163aaa805f53671eec65e39.jpeg)
2、Series类型
![](https://i-blog.csdnimg.cn/blog_migrate/e23936fd2bfaa139902519b5cb11eff4.jpeg)
3、最常用的DataFrame
![](https://i-blog.csdnimg.cn/blog_migrate/f2e1ab56e70809b1980afe56bab4e115.jpeg)
默认合并
df12和df13默认合并的结果:
![](https://i-blog.csdnimg.cn/blog_migrate/c6acc1963a8befb034c2ea0b5ced2503.jpeg)
参数ignore_index
改变生成的索引值
![](https://i-blog.csdnimg.cn/blog_migrate/8be8b1d708578d82c346cb19d6a26fef.jpeg)
参数verify_integrity
默认是False,如果值为True,创建相同的index则会抛出异常的错误
![](https://i-blog.csdnimg.cn/blog_migrate/09937b184a540fbb63d8c659359d26b1.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/27aeeefbf151b46e673e636300dd7fcc.jpeg)
案例实战
假设现在一个excel表中有3个sheet:订单表、订单商品表、商品信息表:
1、订单表
![](https://i-blog.csdnimg.cn/blog_migrate/0428f1c1e85d3fa493c9741aef01ed00.jpeg)
2、订单商品表
![](https://i-blog.csdnimg.cn/blog_migrate/7db307b443581837ffbb13a0674660f5.jpeg)
3、商品信息表
![](https://i-blog.csdnimg.cn/blog_migrate/b4652b95b78cd1cedea1d66f2420be23.jpeg)
现在我们通过合并函数将3个sheet中的内容关联起来:
import pandas as pd
import numpy as np
# 读取订单表中的内容
df1 = pd.read_excel("水果订单商品信息3个表.xlsx",sheet_name=0) # 第一个sheet的内容,索引从0开始
df1
![](https://i-blog.csdnimg.cn/blog_migrate/586598fc0d4953ccd0fc9b4c0a0874b4.jpeg)
# 读取订单商品表
df2 = pd.read_excel("水果订单商品信息3个表.xlsx",sheet_name=1)
# 商品信息表
df3 = pd.read_excel("水果订单商品信息3个表.xlsx",sheet_name="商品信息") # 可以直接指定sheet的名字name,不通过索引
df3
![](https://i-blog.csdnimg.cn/blog_migrate/669d23ec9e6698fee1ce09d51c1fbdcd.jpeg)
第一步:订单表和订单商品表的合并
![](https://i-blog.csdnimg.cn/blog_migrate/1ab69ec9dfbdb620a7705acb23fbb63e.jpeg)
第二步:将上面的结果和商品信息表合并
![](https://i-blog.csdnimg.cn/blog_migrate/2bbf9854a0db9e744a18b56641f25b8b.jpeg)
当我们得到上面的结果后,就可以完成很多的需求,举2个例子说明:
1、不同水果的销量和订单数:根据水果进行分组统计数量和订单数
![](https://i-blog.csdnimg.cn/blog_migrate/d7d42c90749e5bd9bcb5aa6dcc8e2205.jpeg)
2、不同区域的水果销售额和客户数
![](https://i-blog.csdnimg.cn/blog_migrate/e1c027f46c1578f6fe4fc63f4245bac8.jpeg)
总结
两篇关于pandas数据合并的文章,详细介绍了4个函数:merge、concat、join、append的使用;其中,merge和concat最为常用。它们可以是实现SQL中join的功能。不管是交集、并集、还是左右连接,甚至是全连接都是可以直接实现的。
上面的实战案例数据是存放在一个Excel表中。在pandas中,我们可以从不同的来源:Excel、数据库、本地文件夹等获取来进行数据合并,方便后续实现我们的需求,希望本文对读者有所帮助。
往期精彩回顾
适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑黄海广老师《机器学习课程》课件合集
本站qq群851320808,加入微信群请扫码: