如何使用pandas合并数据


前言

在采集数据时,不同类型的数据之间可能有潜在的关联,通过数据合并,可以丰富数据维度,有助于我们发现更多有价值的信息。比如,将用户注册数据与用户购买数据相关联,可以通过用户的基本信息判断用户购买的商品是自己使用还是送人。通过堆叠合并和主键合并的方式,可以将关联的数据信息合并在一张表中。


提示:以下是本篇文章正文内容,下面案例可供参考

一、堆叠合并数据

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

接收DataFrameSeries。表示要合并的左侧数据。无默认值。
right接收DataFrameSeries。表示要合并的右侧数据。无默认值。
how接收'inner''outer''left''right'其中之一。表示数据的连接方式。默认为'inner'
on 接收strsequence。表示两个数据合并时基于的列名(必须存在于两个DataFrame中)。默认为None
left_on 接收strsequence。表示左侧DataFrame中用于合并的列名。如果on参数未设置,则此参数为必须。默认为None
right_on接收strsequence。表示右侧DataFrame中用于合并的列名。如果on参数未设置,则此参数为必须。默认为None
left_index接收bool。表示是否将左侧DataFrame的索引用作连接键。默认为False
right_index接收bool。表示是否将右侧DataFrame的索引用作连接键。默认为False
sort接收bool。表示是否根据合并键对合并后的数据进行排序。当DataFrame没有预设的排序且merge类型为outerleft时,该参数为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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值