前言
在采集数据时,不同类型的数据之间可能有潜在的关联,通过数据合并,可以丰富数据维度,有助于我们发现更多有价值的信息。比如,将用户注册数据与用户购买数据相关联,可以通过用户的基本信息判断用户购买的商品是自己使用还是送人。通过堆叠合并和主键合并的方式,可以将关联的数据信息合并在一张表中。
提示:以下是本篇文章正文内容,下面案例可供参考
一、堆叠合并数据
1、什么是堆叠合并数据
堆叠就是指简单的把两个表拼在一起,也称为轴向连接、绑定或连接。根据轴的方向,数据堆叠可以分为横向堆叠和纵向堆叠。
2、横向堆叠
是将两个表按x轴的方向拼接在一起,可以使用concat函数完成。
concat函数的常用参数及其说明:
参数名称 | 参数说明 |
objs | 接收多个Series、DataFrame、panel的组合。表示参与连接的pandas对象的列表的组合。无默认值 |
axis | 接收int。表示连接轴。可选0或1,默认为0 |
join | 接收str。表示其他轴上的索引是按交集(inner,内连接)还是并集(outer,外连接)进行合并。默认为outer |
ignore_index | 接收bool。表示是否使用连接的轴上的索引值。默认为False |
keys | 接收sequence。表示与连接对象有关的值,用于形成轴方向上的层次化索引。默认为None |
levels | 接收包含多个sequence的list。表示在指定keys参数后,指定用作层次化索引的各级别上的索引。默认为None |
names | 接收list。表示在设置了keys和leves参数后,用于创建分层级别的名称。默认为None |
verify_integrity | 接收bool。表示检查新的连接轴是否包含重复项,如果发现重复项,那么抛出异常。默认为False |
sort | 接收bool。表示对非连接的轴方向上的数据进行排序。默认为False |
copy | 接受bool。表示是否有必要复制数据。默认为True |
当参数axis=1时,concat函数可以做行对齐,然后将列名称不同的两张或多张表合并为一张表。当两个表索引不完全一样时,可以设置join参数以选择是内连接还是外连接。在内连接的情况下,仅仅返回索引重叠部分数据;在外连接的情况下,则显示索引的并集部分数据,不足的地方则使用空值填补。
concat函数的基本使用格式:
pandas.concat(objs, axis=0, join='outer', ignore_index=False, key=None,
levels=None, names=None, verify_integrity=False, sort=False, copy=Ture)
当两份数据行索引完全一样时,不论join参数的取值时inner或outer,结果都是将两个表完全按照x轴方向拼接起来。基于用户信息数据进行横向堆叠,具体实现代码如下:
import pandas as pd
user_all_info = pd.read_csv('***/user_all_info/user_all_info.csv')
df1 = user_all_info.iloc[:,:3]
df2 = user_all_info.iloc[:,:3]
print('合并df1的大小为%s,df2的大小为%s'%(df1.shape,df2.shape))
print('外连接合并后的数据框大小为:',pd.concat([df1,df2],axis=1,join='outer').shape)
print('内连接合并后的数据框大小为:',pd.concat([df1,df2],axis=1,join='inner').shape)
3、
3、纵向堆叠
对比横向堆叠,纵向堆叠是指将两个数据表在y轴方向上拼接,concat函数也可以纵向堆叠。当使用concat函数时,在默认情况下,即axis=0,concat函数做列对齐,将行索引不 同的两张或多张表纵向合并。在两张表的列名并不完全相同的情况下,可以使用join参数。 当join参数取值为inner时,返回的仅仅是列名的交集所代表的列;当join参数取值为outer 付,返回的是列名的并集所代表的列。
当两份数据行列名完全一样时,不论join参数的取值时inner或outer,结果都是将两个表完全按照y轴方向拼接起来。基于用户信息数据进行横向堆叠,具体实现代码如下:
df3 = user_all_info.iloc[:500,:]
df4 = user_all_info.iloc[:500,:]
print('df3的大小为%s,df4的大小为%s' % (df3.shape,df4.shape))
print('内连接纵向合并后的数据框大小为',pd.concat([df3,df4],axis=0,join='inner').shape)
print('外连接纵向合并后的数据框大小为',pd.concat([df3,df4],axis=0,join='outer').shape)
二、主键合并数据
1.什么是主键合并
主键合并,即通过一个或多个键将两个数据集的行连接起来,类似于SQL中的join。 针对两张包含不同特征的表,将根据某几个特征一一对应拼接起来,合并后数据的列数为 两份原数据的列数之和减去主键的数量。
pandas库中的merge函数可以实现主键合并,merge函数的基本使用格式如下
pandas.merge(left,right,how-inner,on=None,left_on=None,right_on=None,
left_index=False,right_index=False,sort=False,suffixes=(x'y'),
copy=True ,indicator=False,validate=None)
2、主键合并的使用
和数据库的join一样,merge函数也有左连接(left)、右连接(right)、内连接(inner 和外连接(outer)。但比起数据库SQL语言中的join,merge函数有其独到之处,如可以 在合并过程中对数据集中的数据进行排序等。根据merge函数中的参数说明,并按照需求修改相关参数,即可以多种方法实现主键合并。
merge函数的常用参数及其说明:
left | 接收DataFrame 或Series 。表示要合并的左侧数据。无默认值。 |
right | 接收DataFrame 或Series 。表示要合并的右侧数据。无默认值。 |
how | 接收'inner' , 'outer' , 'left' , 'right' 其中之一。表示数据的连接方式。默认为'inner' 。 |
on | 接收str 或sequence 。表示两个数据合并时基于的列名(必须存在于两个DataFrame 中)。默认为None 。 |
left_on | 接收str 或sequence 。表示左侧DataFrame 中用于合并的列名。如果on 参数未设置,则此参数为必须。默认为None 。 |
right_on | 接收str 或sequence 。表示右侧DataFrame 中用于合并的列名。如果on 参数未设置,则此参数为必须。默认为None 。 |
left_index | 接收bool 。表示是否将左侧DataFrame 的索引用作连接键。默认为False 。 |
right_index | 接收bool 。表示是否将右侧DataFrame 的索引用作连接键。默认为False 。 |
sort | 接收bool 。表示是否根据合并键对合并后的数据进行排序。当DataFrame 没有预设的排序且merge 类型为outer 或left 时,该参数为True 将返回排序后的结果。 |
suffixes | 接收tuple 。表示用于追加到重叠列名的后缀,以避免列名冲突。默认为('_x', '_y') 。 |
为了方便读者操作,将用户信息表中用户编号和是否愿意下载特征单独提出放至用户 下载意愿表(user_download.csv),同时将编号、每月支出特征提出放到用户每月支出信息 表(user_pay_info.csv)。使用merge函数合并用户下载意愿表和用户每月支出信息表,代码如下
pay_info = pd.read_csv('***/user_pay_info.csv')
download_info = pd.read_csv('***/user_download.csv')
download_and_pay = pd.merge(download_info,pay_info,left_on='用户编号',right_on='编号')
print('每月支出原始形状',pay_info.head())
print('用户下载医院原始形状',download_info.head())
print('下载意愿与每月支出信息表合并形状',download_and_pay.shape)