目录
3.2.2 merge示例:歌曲类型数据和歌曲数据进行merge
3.2.3 merge示例:to_timedelta和floor函数的使用
4.2.1 stock_2016和stock_2017按照行标签进行关联,设置为outer连接
1. 数据组合简介
在进行数据分析工作之前,需要进行数据清理工作,数据清理有一下目标:
- 每个观测值成一行
- 每个变量成一行
- 每种观测单元构成一个表格
数据整理好后,可能需要多张表格组合在一起才能进行某些问题的分析
单个表也可以被分割成多个,比如时间序列数据,每个日期可能在一个单独的文件中
2.concat拼接数据
2.1 方法
基本格式:
| 方法 | 说明 |
| pd.concat([df1,df1,...]) | 多个数据集之间按行标签索引或者列标签索引拼接,join属性值默认是outer,也可以设置为inner,如果是按照行标签索引对其即进行列拼接加上axis=1(对列相关的数据进行操作都是axis=1) |
outer:对于无法对齐的列,默认为nan
inner:对于无法对其的列,默认不显示出来
2.2 行拼接:按照列标签索引对齐
注意:因为默认是outer,所以对于行拼接时无法对齐的列,默认填充NAN
其中可以使用ignore_index=True属性,使concat函数忽略行标签索引,使索引重新生成
注意:1.3节有讲到在append函数中添加该属性,目的是忽略行标签按索引,直接在后面添加数据
两次使用意思差不多
# 将 df1、df2和 df3 按照列标签对齐,进行行拼接¶
pd.concat([df1,df2,df3])
# concat 拼接数据时忽略原有数据的行标签
pd.concat([df1,df2,df3],ignore_index=True)
2.3 列拼接:按照行标签索引对齐
注意:因为默认是outer,所以对于列拼接时无法对齐的列,默认填充NAN
#df1 和 new_series 按照行标签对齐,进行列拼接
pd.concat([df1,new_series],axis=1)
2.4 join参数的设置
concat的join参数:
join参数的属性值就是前文提到的outer和inner
3. merge关联数据
3.1 方法简介
merge方法类似于sql中的join语句,用于两个数据集之间按照行标签索引列标签索引链接,默认是inner,可以设置为:left、right、outer
基本格式;
| 方法 | 说明 |
| pd.merge(left,right,...) | 两个数据集直接关联操作 |
| left.merge(right,...) | 两个数据集直接关联操作 |
mergr参数:
- left:左侧数据集
- right:右侧数据集
- how:关联方式,默认为inner,可以设置为:left、right、outer
- on='列名':左侧和右侧数据以哪一列进行关联操作,左右两侧列名相同时才能指定on参数
- left_on='列名'和right_on='列名':左右两侧关联时,列名不同时使用
- left_index=False:默认为False,设置为True,表示左侧的行标签和右侧的数据进行关联
- right_index=False默认为False,设置为True,表示左侧数据和右侧行标签进行关联
merge以数据集为主,主数据集全部展示,另一个数据没有对应的数据补充nan或者不展示
3.2 merge实例
3.2.1 从sqlite数据库中加载table数据
sqlite是一个微型的、本地的数据库,不必像mysql需要额外启动运行,依靠其特殊的文件,用来存储数据,并提供和数据文件交互的方法,或者称sqlite为本地数据文件系统更为贴切
# 部分版本的anaconda没有sqlalchemy模块,
# 需要额外单独安装:pip install sqlalchemy
from sqlalchemy import create_engine
# 创建数据库连接对象,并指定数据文件路径
engine = create_engine('sqlite:///data/chinook.db')
# 加载其中的 tracks 数据表的数据
tracks=pd.read_sql_table('tracks',engine)
3.2.2 merge示例:歌曲类型数据和歌曲数据进行merge
tracks_sub=tracks[['TrackId','GenreId','Milliseconds']]
# 将 genres 和 tracks 数据按照 GenreId 进行 merge 操作,设置为 left 连接
genres_track=pd.merge(genres,tracks_sub,on='GenreId',how='left')
#或者:
genres_track=genres.merge(tracks_sub,on='GenreId')
#如果是df.merge则不需要left或right参数,默认以df为主数据集
3.2.3 merge示例:to_timedelta和floor函数的使用
#示例:计算不同类型的音乐的平均时长
genre_time=genres_track.groupby('Name')['Milliseconds'].mean()
genre_time
# 将 genre_time 数据从 ms 转换为时间单位,保留到 s,并按时间从高到低排序
pd.to_timedelta(genre_time,unit='ms').dt.floor('s').sort_values(ascending=False)
4. join关联数据
4.1 方法简介
join方法类是merge方法的一个特殊情况,被调用的数据集行标签索引或列标签索引和另一个数据集的行标签索引关联,默认是left,可以设置为:right、inner、outer
基本格式:
| 方法 | 说明 |
| df.join(other,...) | 在左侧数据集的行标签或列标签和右侧数据集的行标签进行关联操作 |
join函数的参数:
- other:右侧数据集
- how:关联方式,默认left,可以设置为:right、inner、outer(left我理解的是以左数据集为主数据集)
- on='左侧行标签或列标签':左侧数据集的行标签或列标签名称,on省略时,默认左侧行标签
- lsuffix:关联后的数据中出现相同列名后,lsuffix指定指定左侧数据集出现相同列名的后缀
- rsuffix:关联后的数据中出现相同的列名后,rsuffix指定右侧数据集出现相同列名的后缀,lsuffix和rsuffix说白了就是在相同的列名后面加入不同的后缀,以区分不同的列
4.2 join示例
# 示例:stock_2016 和 stock_2017 按照行标签进行关联,设置为 outer 连接
stock_2016.join(stock_2017,how='outer',lsuffix='2016',rsuffix='2017')
# 示例:stock_2016 和 stock_2018 按照 Symbol 进行关联
stock_2016.join(stock_2018.set_index('Symbol'),on='Symbol',lsuffix='2016',rsuffix='2018')
5.总结
concat适合多个数据集合并,merge适合两个数据集合并,join适合合并有重名的行标签名或列标签名的情况
concat左右两个数据集都要写在()[]内,merge主函数集可以写在()里外都行,且没有[],join主数据集必须写在外面
本文介绍了数据预处理中的数据组合方法,包括使用Pandas的concat、merge和join。详细讲解了如何进行行拼接、列拼接,以及设置join参数。同时,通过实例演示了如何从SQLite数据库加载数据并进行数据关联。

1万+

被折叠的 条评论
为什么被折叠?



