数据城堡参赛代码实战篇(四)---使用pandas合并数据表
小编们最近参加了数据城堡举办的“大学生助学金精准资助预测”比赛,分组第19名的成绩进入了复赛,很激动有木有!在上一篇文章中,小编主要介绍了pandas中使用drop_duplicates()方法去除重复数据。本篇,小编文文将带你探讨pandas在数据合并的应用。
1 上期回顾
首先,小编带你回顾一下drop_duplicates()方法的使用,我们定义一个DataFrame如下:
df=pd.DataFrame({'id':[1,1,2],'value':[5,10,12]})
print (df)
输出如下:
id value
0 1 5
1 1 10
2 2 12
可以看到,有两个id为1的数据行,如果我们只想保留最后一条id为1的数据,那么使用drop_duplicates()方法如下:
df.drop_duplicates(['id'],keep='last',inplace=True)
print (df)
得到如下的结果:
id value
1 1 10
2 2 12
2 使用pandas合并数据
根据官方给出的数据,我们分别提取了消费数据、图书馆进出数据、图书借阅数据的特征,并分别写入了不同的csv文件。那么我们如何将这一系列数据文件合并成一个文件呢?pandas提供了多种对数据进行合并的方法,不过本文主要介绍的是merge()方法的应用。
由于官方数据比较复杂,我们将使用两个简单的DataFrame来介绍merge函数的应用:
df1=pd.DataFrame({'key':['b','b','a','c','a','a','b'],
'data':range(7)})
df2=pd.DataFrame({'key':['a','b','d'],
'data2':range(3)})
输出两个表:
data key
0 0 b
1 1 b
2 2 a
3 3 c
4 4 a
5 5 a
6 6 b
data2 key
0 0 a
1 1 b
2 2 d
首先我们来看看直接使用merge()方法的效果:
data key data2
0 0 b 1
1 1 b 1
2 6 b 1
3 2 a 0
4 4 a 0
5 5 a 0
可以看到,我们在合并数据表时并没有指定根据哪一列合并,那么pandas会自动搜索两个DataFrame中的相同列,如果有,则按该列进行合并,如果没有,则会报下面的错:
pandas.tools.merge.MergeError: No common columns to perform merge on
好了,了解了merge的基本使用,我们接下来主要来探究两个问题:
2.1 关于连接属性
在上面的合并过程中,我们并没有指定合并的列,它会自动搜索两个DataFrame中相同的列进行合并,所以上述代码与下面的代码效果是一样的:
(pd.merge(df1,df2,on='key'))
如果两个数据表中没有相同的列呢?假定我们的两个数据表是下面的样子:
df3=pd.DataFrame({'key1':['b','b','a','c','a','a','b'],
'data':range(7)})
df4=pd.DataFrame({'key2':['a','b','d'],
'data2':range(3)})
此时,我们需要显式地指定根据哪一列进行合并,代码如下:
print (pd.merge(df3,df4,left_on='key1',right_on='key2'))
输出如下:
data key1 data2 key2
0 0 b 1 b
1 1 b 1 b
2 6 b 1 b
3 2 a 0 a
4 4 a 0 a
5 5 a 0 a
可以看到,我们指定按照df3的key1列和df4的key2列进行合并,结果中两列的值都是相同的。
2.2 关于连接方式
细心的读者可能已经发现了,在我们合并df1和df2的时候,我们没有指定按照何种方式连接,结果中没有key值为‘c’或者‘d’的数据,这是因为pandas的merge()方法默认使用的是内连接(inner),结果中的键是交集,即只有key值为‘a'和’b'的列,因此上述合并df1和df2的代码和下面的代码等同:
pd.merge(df1,df2,how='inner')
另一个需要注意的地方是,pandas对相同的键做笛卡尔积运算。例如df1中key值为’a'的有3行,df2种key值为‘a’的有1行,那么合并结果中key值为‘a’的有3*1=3行。
如果不想做内连接,pandas提供了像数据库一样的外连接方式,有全外连接、左外连接和右外连接三种方式,接下来,小编带你探究这三种方式的区别:
全外连接
使用如下的代码进行全外连接
print (pd.merge(df1,df2,how='outer'))
输出如下:
data key data2
0 0.0 b 1.0
1 1.0 b 1.0
2 6.0 b 1.0
3 2.0 a 0.0
4 4.0 a 0.0
5 5.0 a 0.0
6 3.0 c NaN
7 NaN d 2.0
可以看到,全外连接取的是两个DataFrame的键的并集,如果一个键只在其中一个DataFrame中出现,则结果中会用NaN来补足数据。例如,只有df1中有key值为‘c’的数据,则合并结果中data2列使用NaN来补足数据。
左外连接
使用如下的代码进行左外连接
print (pd.merge(df1,df2,how='left'))
输出如下:
data key data2
0 0.0 b 1.0
1 1.0 b 1.0
2 6.0 b 1.0
3 2.0 a 0.0
4 4.0 a 0.0
5 5.0 a 0.0
6 3.0 c NaN
可以看到,左外连接求取的是左边DataFrame即df1的键值,即['a','b','c'],那么如果某些键不存在于右边的DataFrame中,对应的数据以NaN补足。
右外连接
使用如下的代码进行右外连接
print (pd.merge(df1,df2,how='right'))
输出如下:
data key data2
0 0.0 b 1.0
1 1.0 b 1.0
2 6.0 b 1.0
3 2.0 a 0.0
4 4.0 a 0.0
5 5.0 a 0.0
6 NaN d 2.0
可以看到,右外连接求取的是右边DataFrame即df2的键值,即['a','b','d'],那么如果某些键不存在于左边的DataFrame中,对应的数据以NaN补足。
3 总结
本篇,小编带你初步探索了pandas中合并数据表方法merge()的应用,并重点介绍了两个主要的参数,连接键值on和连接方式how。至此,有关数据特征提取以及数据合并的工作已经全部结束,下一节,小编将要开始带领大家一起使用sklearn机器学习包对数据进行分类预测,敬请期待!
想了解更多? 那就赶紧来关注我们
- Golang语言社区--【基础知识】入门
- Go语言的小细节--map
- RBD至FileStore之所见(原理篇)
- FileStore压缩存储(优化篇)
- 深入学习Golang—channel
- 当Python字符串遇上MySQL
- Spring Boot 2.0正式发布,升还是不升呢?
- Spring Cloud构建微服务架构:分布式服务跟踪(入门)
- Spring Cloud构建微服务架构:分布式服务跟踪(跟踪原理)
- Spring Cloud Gateway真的有那么差吗?
- Spring Cloud构建微服务架构:消息驱动的微服务(核心概念)【Dalston版】
- Golang语言社区--【基础知识】循环
- Spring Cloud构建微服务架构:消息驱动的微服务(消费组)【Dalston版】
- Spring Cloud构建微服务架构:消息驱动的微服务(消费分区)【Dalston版】
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 六、乘胜追击,将剩下的Git知识点搞定
- 树莓派基础实验39:解析无线电接收机PWM、SBUS信号
- nodejs源码分析第十九章 -- udp模块
- Spark Extracting,transforming,selecting features
- 逆向so文件调试工具ida基础知识点
- 二叉搜索树中的众数
- 了解递归:普通函数递归和非递归栈式实现之间的区别
- 字节真题 ZJ26-异或:使用字典树代替暴力破解降低时间复杂度
- curl命令半天没响应,有可能返回内容导致session挂了
- 查看JVM参数信息 查看G1堆的使用情况
- LC1263-AI寻路优化: 距离优先bfs -> heuristic + A* -> tarjan + A*
- 从Zookeeper 到 Elastic Job 的原理解析和使用(一)
- 从Zookeeper 到 Elastic Job 的Simple Job使用(二)
- resteasy 接收post请求参数——json and 表单
- 合理配置Mysql缓存,提高缓存命中率