数据的合并
在拥有了数据基本筛选能力后,我们还要有更加nb的操作,接下来就学习如何利用Pandas合并多个DataFrame数据,以及筛选我们心仪的数据。在数据合并里面主要讲两个函数的用法
1️⃣Concat()函数
数据合并主要包括下面两种操作:
轴向连接(concatenation):
pd.concat():可以沿一个轴将多个DataFrame对象连接在一起,形成一个新的DataFrame对象。
concat()函数可以将数据根据不同的轴作进行合并。我们先看一下concat()的常用参数:
pd.concat(objs, axis=0, join=‘outer’)
- objs: series、dataframe或者是panel构成的序列list。
- axis: 需要合并链接的轴,0是行,1是列,默认是0。
- join:连接的方式 inner,或者outer,默认是outer。
先创建两个DataFrame对象
import pandas as pd dict1={ 'A': ['A0', 'A1', 'A2', 'A3'], 'B': ['B0', 'B1', 'B2', 'B3'], 'C': ['C0', 'C1', 'C2', 'C3']} df1=pd.DataFrame(dict1) print(df1) dict2={ 'B': ['B0', 'B1', 'B2', 'B3'], 'C': ['C0', 'C1', 'C2', 'C3'], 'D': ['D0', 'D1', 'D2', 'D3']} df2=pd.DataFrame(dict2) print(df2) pd.concat([df1,df2],axis=0,join='outer',ignore_index=True)
✨当concat()使用默认参数合并df1和df2时,合并结果:
通过上面的结果可以发现,当join=‘outer’,axis参数为0时,列进行并集处理,纵向表拼接,缺失值由NaN填充,并且会保留原有数据的行索引。
如果两个表的index都没有实际含义,使用ignore_index参数,置true,重新整理一个新的index。
✨当concat()的axis参数为1合并df1和df2时,合并结果:
0 |
1 | 2 | 3 | 4 | 5 | |
0 | A0 | B0 | C0 | B0 | C0 | D0 |
1 | A1 | B1 | C1 | B1 | C1 | D1 |
2 | A2 | B2 | C2 | B2 | C2 | D2 |
3 | A3 | B3 | C3 | B3 | C3 | D3 |
可以看出当join=‘outer’,axis参数为1时,行进行并集处理,横向表拼接,缺失值由NaN填充。
这种合并的方式,组合特别多,在这不做过多的演示,大家可以多动手,多尝试。
当concat()的join参数为inner时合并df1和df2时:
pd.concat([df1,df2],axis=0,join='inner')
综合上面的结果可以得到:
如果为inner,得到的是两表的交集,如果是outer,得到的是两表的并集。
2️⃣merge()函数
融合(merging):pd.merge()方法可以根据一个或多个键将不同DataFrame中的行连接起来。
merge()函数通过指定连接键拼接列数据,我们先看一下merge的常用参数:
merge(left, right, how='inner', on=None)
1.left和right:两个要合并的DataFrame
2.how:连接方式,有inner、left、right、outer,默认为inner
3.on:指的是用于连接的列索引名称,必须存在于左右两个DataFrame中,如果没有指定且其他参数也没有指定,则以两个DataFrame列名交集作为连接键
运行下面的代码,看看效果
import pandas as pd left = pd.DataFrame({'key':['a','b','b','d'],'data1':range(4)}) print(left) right = pd.DataFrame({'key':['a','b','c'],'data2':range(3)}) print(right)
当merge()使用默认参数连接两个DataFrame时:
pd.merge(left, right)
✨效果
key |
data2 | data1 | |
0 | a | 0 | 0 |
1 | b | 1 | 1 |
2 | b | 1 | 2 |
merge()默认做inner连接,并且使用两个DataFrame的列名交集(key)作为连接键,同样,最终连接的数据也是两个DataFramekey列数据的交集。
当两个DataFram使用做outer连接时:
pd.merge(left,right,on=['key'],how='outer')
✨效果
key |
data1 | data2 | |
0 | a | 0.0 | 0.0 |
1 | b | 1.0 | 1.0 |
2 | b | 2.0 | 1.0 |
3 | d | 3.0 | NaN |
4 | c | NaN | 2.0 |
当merge()做outer连接时最终连接的数据是两个DataFramekey列数据的并集,缺失的内容由NaN填充
pd.merge(left,right,on=['key'],how='left')
pd.merge(left,right,on=['key'],how='right')
上面这两个代码大家自行尝试
🚩上面我们了解两种合并数据的方式,初学者可能会感到迷惑,很容易混淆,那就举个例子:
例如: 现在有两张表格分别存储了9月和10月份的成交信息,那么这个时候我们就可以使用concat( )将两个表沿着0轴合并。
例如: 现在有两张表格,一个是成交信息,包含订单号、金额、客户ID等信息;第二个是客户信息,包含客户ID、姓名、电话号等信息,那么这个时候我们就可以使用merge()根据客户ID将两个表合并成一个完整的表。