数据城堡参赛代码实战篇(四)---使用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机器学习包对数据进行分类预测,敬请期待!

想了解更多? 那就赶紧来关注我们

本文分享自微信公众号 - 小小挖掘机(wAIsjwj)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-02-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FSociety

SQL中GROUP BY用法示例

GROUP BY我们可以先从字面上来理解,GROUP表示分组,BY后面写字段名,就表示根据哪个字段进行分组,如果有用Excel比较多的话,GROUP BY比较类...

5.1K20
来自专栏腾讯高校合作

【倒计时7天】2018教育部-腾讯公司产学合作协同育人项目申请即将截止!

15320
来自专栏前端桃园

知识体系解决迷茫的你

最近在星球里群里都有小伙伴说道自己对未来的路比较迷茫,一旦闲下来就不知道自己改干啥,今天我这篇文章就是让你觉得一天给你 25 个小时你都不够用,觉得睡觉都是浪费...

19440
来自专栏钱塘大数据

中国互联网协会发布:《2018中国互联网发展报告》

在2018中国互联网大会闭幕论坛上,中国互联网协会正式发布《中国互联网发展报告2018》(以下简称《报告》)。《中国互联网发展报告》是由中国互联网协会与中国互联...

13250
来自专栏Ken的杂谈

【系统设置】CentOS 修改机器名

17330
来自专栏haifeiWu与他朋友们的专栏

复杂业务下向Mysql导入30万条数据代码优化的踩坑记录

从毕业到现在第一次接触到超过30万条数据导入MySQL的场景(有点low),就是在顺丰公司接入我司EMM产品时需要将AD中的员工数据导入MySQL中,因此楼主负...

26740
来自专栏钱塘大数据

理工男图解零维到十维空间,烧脑已过度,受不了啦!

让我们从一个点开始,和我们几何意义上的点一样,它没有大小、没有维度。它只是被想象出来的、作为标志一个位置的点。它什么也没有,空间、时间通通不存在,这就是零维度。

27130
来自专栏怀英的自我修炼

考研英语-1-导学

英二图表作文要重视。总体而言,英语一会比英语二难点。不过就写作而言,英语二会比英语一有难度,毕竟图表作文并不好写。

11310
来自专栏腾讯社交用户体验设计

ISUX Xcube智能一键生成H5

50820
来自专栏微信公众号:小白课代表

不只是软件,在线也可以免费下载百度文库了。

不管是学生,还是职场员工,下载各种文档几乎是不可避免的,各种XXX.docx,XXX.pptx更是家常便饭,人们最常用的就是百度文库,豆丁文库,道客巴巴这些下载...

43230

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励