简介
与多个数据集嬉戏是数据科学家的共同任务。而且,对于初学者或者中级学者学习这个技能是极其重要的。
我从过去的数据科学竞赛中有了写这篇文章的想法。很多时候,当合并或处理数据集时,人们最终得到讨厌的NA值(与预期不一致的值)。如果最终你还是遇到了,不要惊慌。你只需要练习这些挑战,你将不会再得到任何NA值。
当你成功的完成了这些挑战,你将精通于通过基本的几个操作就可以操作数据帧、合并多个数据集。为了方便,我想通过R和Python演示这些操作,当然,我也给了4个练习题。
顺便插一句:为了好玩,我已经从一个名为“权力的游戏”的一部热门电视剧制作了一个虚拟数据集。如果你也对此疯狂,太棒了!如果没有,你仍然会发现它很容易理解。
每个挑战者可以再次下载数据集。http://www.analyticsvidhya.com/wp-content/uploads/2016/06/Challenges.zip
36大数据专稿, 本文由36大数据翻译,不授权任何网站使用,除了36大数据网站和微信公众号,所有其他的转载均为侵权!
内容:
挑战1:添加更多的观察点
挑战2:删除观察点
挑战3:添加水平列
挑战4:基于共同的属性添加列
挑战5:基于观察序列(指数)添加列
挑战6:删除重复的观察点
挑战7:删除列
挑战8:修改数据框的值
挑战9:重命名列名
在开始挑战之前,确定你已经下载了相应程序。
挑战1:添加更多的观测点
1) 结构化数据集
我们从“权利的游戏”中虚构了个数据集名字叫做house。它包含了不同的家族。想象这些家族是一个个独立的家庭,假设有两个新出现的家族的信息在数据集house_extra 中。
任务:将house_extra中的数据集中到house中。(即合并两个数据集)
你可以通过如下的简单命令行将数据集 house_extra合并到数据集house中。
结果输出如下:
2)非结构化数据集
当你有一个非结构化数据集的时候,如何处理呢?把非结构化数据集当做是没有任何矩阵或数据帧的数据。不过,我们可以添加新的观察点吗?
假设你有一个新house的数据要加入到house 里。新house是“redwyne”,目前在“The Reach”区域。现在,我们想在我们现有的house数据中添加这个新的观察点。让我们看看如何做。
输入结果为:
正如你所见,新的redwyne已经被添加到了house的数据框中了。
重要提示
1、有时候,我们需要从一个比源数据集有新列的数据集中添加一个观察者,怎么办?让我们试着修改下数据集,看看这个怎么操作。
现在,house数据集包含两个列(House,Region),领一个数据集house_new包含列(House,Region,Religion).想一想,Religion列不在house的数据集中,但我们需要合并这些数据集,如何做呢?
我们看到house数据中增加了Religion列,而且原有的数据中该列的值都为NaN。
1.这个操作只适应于Python的用户。
继续要点1,增加了新的house到旧的数据集中,我们得到了重复的索引值,这个是个明显的问题。
现在,如果我们试着访问第一个元素的话,我们将得到什么内容呢?思考一下:
结果输出如下:
我们看到了2个元素,为什么会这样呢?
折是因为,在合并了两个数据集之后,新的观察点并没有根据新的数据集进行更新。因此,如果我们试着访问第一个元素的时候,就出现了如上的结果。为了解决这个问题,我们也需要处理索引。可以这样做:
结果如下:
正如我们所见,现在的索引已经和原来的索引不同了,现在,我们可以访问任意行而不会有问题了。
练习1:如果house有个额外的变量,如何将house_new的数据集通过append或者concat操作合并到一起?
练习2:写一个代码,把house的数据添加到house_new中。(house_new的观察点在上面)
挑战2:删除观察点
删除行
假设我们有一个候选数据集,包括每一个家庭的继承者信息。他们根据在同一家庭的年龄进行降序排列。两个家庭之间没有顺序。
现在我们想移除candidates数据集中的最上面两行。
输出如下:
基于条件删除行
在电视剧中,Robb Stark在婚礼上被杀了,因此他已经死了,他不能成为Stark House的继承人,我们需要从这个数据集中将他删除掉。
任务:准备一个新的Robb Stark被移除的客户清单。
输出如下:
挑战3:添加水平列
很多时候,一个数据集在不同的文件中。每一个文件包含一些唯一的信息。我们需要合并这些信息获取最大的信息。
在这种情况下,我们如何决定我们应该应用什么样的合并技术?
答案是,它取决于问题的要求。下面是不同类型的合并操作和在不同情况下如何决定合并技术应用的见解。
有些时候问题是连续的。
让我们来看这个例子,需要合并的数据结构如下。
在这种情况下,我们需要使用另一个的数据映射索引。
为了得到每个家族的军事力量,我们需要将military的数据加入到house中。
结果如下:
这不是很简单?实际上,因为索引定位是相似的,这就是为什么我们能够合并这两个数据集,但是并不是始终是这样。事实上,这在任何数据科学竞赛中都很少会发生。挑战4将说明真正的麻烦。
挑战4:基于共同的属性增加列
现在,如何合并一个索引没有关联度的数据集?
在这种情况下,总有一个共同的属性(或多个密钥)在我们要组合的数据集上。但是,你需要找到数据的共同的属性。它们可以是列或索引。
提示:更多的情况下,相同的属性一般是ID,请留意这个。有很多的不同的方法去合并上面提到的问题。现在我们有house数据集和candidates数据集。为了告诉你在这些应用操作过程中有不同的变化,我要解决数据集的各种不同的问题和情况。
考虑一下如下的问题应该如何解决。
问题:哪一个继承者有最大的军事力量?
只从candidates数据集中看继承者的名字是不能回答这个问题的,为了回答这个问题,我们必须从house的数据集中扩展military这个信息。
我们如何做呢?他们的索引没有一一对应,在他们之间有任何普通属性吗?
是的,两个数据集中都有house列。现在我们将看到我们如何基于普通的列属性合并上面的数据集。
输出如下:
通过看上面的数据框架,我们得出Daenerys Targaryen是武力最厉害的家族。但,为什么Jorah Mormont得到的是NaN呢?
这儿有一些需要注意的事情。
- 第一行代码中,我们用了都存在于两个数据集中的“on/by=”House””列,实际上,我们是基于特殊key合并的数据。当我们在第二行用left_on/by.x& right_on/by.y时,他们有不同的列名。
- 在两个代码中,我们用how=’left’/all.x=TRUE在主键House中,只左关联了数据。我们使用左关联主要是因为我们想得到所有武力的信息。
- Tyrell家族在合并数据集中没有数据,因为家族Tyrell没有继承人数据,而左关联则需要这个。
- 家族Mormont在House数据中没有任何信息,因此继承人Jorah Mormont 在合并之后的数据中是NaN.
在这里使用左合并主要是因为我们只想要继承者的信息,因此,在上面的代码中,candidates是左数据集,是使用它的House主键。
左关联
注:我已经在标题和注解中使用“merge”。它是我将用于组合或连接数据集的通用术语。代码中的“merge”是合并、连接或合并的语法。
问题: 列出所有的家族的军事实力和合法的继承人
现在,我们必须关联每个家族的信息,因此,军事力量已经在house数据集中了,我们要做的就是找出在candidates数据集中的每个家族的继承人了。
换句话,我们需要从candidates数据集中提取继承人名字,并且匹配到正确的家族中。看看代码:
这将提供每个家族所有的候选人,连同他们的军事实力与原候选人。在candidates数据集中,一个特定家族的一个老年人被匹配在其他家族上。我们也可以执行一个正确的合并操作来做同样的事情。
输出如下:
这里使用了 how=”right”/all.y=True 只从右数据中关联数据。.
右链接
问题:列出至少有一个继承人的家族。
有时候,我们仅仅只需要两个数据集合并之后的一部分数据。也就是说,我们只需要house和candidates的共有的部分,而不是删除掉合并之后缺少数据的观测点,直接语句如下:
输出如下:
这里我们用了 how=”inner”/all=FALSE 从两个数据集中取共有数据。
内关联
问题:列出关于家族和继承者的所有可用信息?
我们需要所有的关于candidates和houses的所有数据。不管信息是否可用。也就是说,我们想要house和candidates两个数据集的联合信息。
我们可以用下面的代码:
这里我们用 how=”outer”/all=True 来联合两个数据集的数据。.
联合关联
挑战5:基于观察序列(指数)添加列
有时一般的属性或者键值是两个数据集的索引或者索引在一个数据集中,列在另外一个数据集中。我们准备处理一个简单的问题,两个键值都是索引。然后,我们必须找出如下给出的练习题中的一个解决方案。假设数据集如下:
我们先通过如下代码合并两个数据集。
对于两个基于基本索引的数据集合并来说,联合函数是一个方便的方法。但是,我们能通过使用on 参数来合并一个键值是列的数据集。
对于两个基于基本索引的数据集合并来说,联合函数是一个方便的方法。但是,我们能通过使用on 参数来合并一个键值是列的数据集。
注意:如果你正在合并的数据有一个相同的不同于一般属性列名称呢?将会发生什么?你能够很容易的处理,看看如下的例子:
如果你运行合并代码,默认会加一些后缀(_x,_y),除非你加入自己的后缀。
结果如下:
练习3:编写基于house数据集的左连接的代码
挑战6:删除重复的观者点
让我们带着问题开始这个章节:
现在,我们有两个如下数据集:house和candidates。你知道每一个家族的军事实力的下一个继承人的细节吗?
现在,使用house键从candidates数据集中使用合并操作。
正如你所看到的,有和我们的问题无关的重复数据。你必须了解数据集的结构和用于合并的方法。否则,你将得到一个你认为可以进行分析的数据集,但它却不是你想要的,并且会影响结果输出。
花一分钟想想这个问题的可能解决办法。
为了解决这个问题,我们可以提供好几种方法,看看我们的解决方法:
1、删除掉重复值:我们可以通过保留candidate数据中最上面的第一个数据的方式删除其他冗余的数据。我们使用第一个数据是因为candidates是根据年龄倒序排列的。因此,最年长的孩子在最上面的位置。如下是代码:
现在,我们合并两个数据集。
输出如下:
正如我们看到的,从家族Stark中移除了Arya Stark,从家族Lannister中移除了“Cersi Lannister,
2、合并重复项:让我们看看例子。
假设一个家族中有两个成员,每个成员都单独有军事力量,如给出的家族数据集中,Starks有2万个士兵,Arya Stark和Robb Stark也各有2万个士兵。
但当形成每个家族最有权力的继承人的列表的时候,最年长的继承者有第一选择权继承皇位,因此,我们仅需要一个家族一个继承人即可。
我们如何移除冗余呢?通过上面简单的删除冗余的方法就会得到错误的数据。因此我们必须对一个家族的每个成员增加军事力量。所以,需要对不同的问题提供不同的技术。
挑战7:删除列
在合并数据集之后,我们最终得到了有好多列的数据集,一些列是没有用的,或者已经在其他数据中有了这个信息。
假设我们的数据集如下:
这个数据集显示了两个非常相似的变量是 Region_left 和Region_right.,他们两个中的Region_right.是没什么用的,我们想删除这个列。
输出如下:
挑战8:修改数据帧的值
修改一个特殊元素:
我们的工作还没有完成,还有很多我们需要关注的不规则的数据。一个数据集可能包含不正确的信息,我们从上章节的最后合并了一个数据集,其中Arya Stark是在North区域的,但数据显示她的区域是Westros。
我们必须修改区域Arya Stark 为 North。
输出如下:
在这个操作结束之后,区域 Arya Stark修改为了North
基于条件的元素修改:
在我们的数据集中,区域Westros 是很多领域的范称,因此,我们必须修改所有的Westros为Kings Landing,看看怎么做:
输出如下:
Challenge 9: 重命名列名称
我们已经完成了所有挑战,最后当你想修改一个列明的时候你已经有了一个解决方案。在我们的数据集中,我们想修改一个列明从Region_left改为Region。
如下是我们修改的原表。
修改列名称的代码如下:
输出如下:
结束。
如果你已经读到这一行,我想称赞你的耐心和毅力,表示你已经了解了这些挑战。我认为所有合并、联合、使用数据集的各种类型都已经包含了。因此,在这些挑战的工作将使你的知识足够全面,以应付任何情况。
为了获得最佳效果,请确保你做这9个挑战和4个练习。如果有别的事情,你认为可以做得更好,可以自由选择。
你喜欢阅读这篇文章吗?你是否遵循一个不同的方法/包/库来执行这些会谈。我很想和你在评论中互动。
End.
转载请注明来自36大数据(36dsj.com):36大数据 » 实战教程:在R和Python中,9个数据合并和数据子集操作上的挑战
爱盈利-运营小咖秀 始终坚持研究分享移动互联网App数据运营推广经验、策略、全案、渠道等纯干货知识内容;是广大App运营从业者的知识启蒙、成长指导、进阶学习的集聚平台;