簡介
與多個數(shù)據(jù)集嬉戲是數(shù)據(jù)科學(xué)家的共同任務(wù)。而且,對于初學(xué)者或者中級學(xué)者學(xué)習(xí)這個技能是極其重要的。
我從過去的數(shù)據(jù)科學(xué)競賽中有了寫這篇文章的想法。很多時候,當(dāng)合并或處理數(shù)據(jù)集時,人們最終得到討厭的NA值(與預(yù)期不一致的值)。如果最終你還是遇到了,不要驚慌。你只需要練習(xí)這些挑戰(zhàn),你將不會再得到任何NA值。
當(dāng)你成功的完成了這些挑戰(zhàn),你將精通于通過基本的幾個操作就可以操作數(shù)據(jù)幀、合并多個數(shù)據(jù)集。為了方便,我想通過R和Python演示這些操作,當(dāng)然,我也給了4個練習(xí)題。
順便插一句:為了好玩,我已經(jīng)從一個名為“權(quán)力的游戲”的一部熱門電視劇制作了一個虛擬數(shù)據(jù)集。如果你也對此瘋狂,太棒了!如果沒有,你仍然會發(fā)現(xiàn)它很容易理解。
每個挑戰(zhàn)者可以再次下載數(shù)據(jù)集。http://www.analyticsvidhya.com/wp-content/uploads/2016/06/Challenges.zip
36大數(shù)據(jù)專稿,?本文由36大數(shù)據(jù)翻譯,不授權(quán)任何網(wǎng)站使用,除了36大數(shù)據(jù)網(wǎng)站和微信公眾號,所有其他的轉(zhuǎn)載均為侵權(quán)!
內(nèi)容:
挑戰(zhàn)1:添加更多的觀察點
挑戰(zhàn)2:刪除觀察點
挑戰(zhàn)3:添加水平列
挑戰(zhàn)4:基于共同的屬性添加列
挑戰(zhàn)5:基于觀察序列(指數(shù))添加列
挑戰(zhàn)6:刪除重復(fù)的觀察點
挑戰(zhàn)7:刪除列
挑戰(zhàn)8:修改數(shù)據(jù)框的值
挑戰(zhàn)9:重命名列名
在開始挑戰(zhàn)之前,確定你已經(jīng)下載了相應(yīng)程序。
挑戰(zhàn)1:添加更多的觀測點
1) 結(jié)構(gòu)化數(shù)據(jù)集
我們從“權(quán)利的游戲”中虛構(gòu)了個數(shù)據(jù)集名字叫做house。它包含了不同的家族。想象這些家族是一個個獨立的家庭,假設(shè)有兩個新出現(xiàn)的家族的信息在數(shù)據(jù)集house_extra 中。
任務(wù):將house_extra中的數(shù)據(jù)集中到house中。(即合并兩個數(shù)據(jù)集)
你可以通過如下的簡單命令行將數(shù)據(jù)集?house_extra合并到數(shù)據(jù)集house中。
結(jié)果輸出如下:
2)非結(jié)構(gòu)化數(shù)據(jù)集
當(dāng)你有一個非結(jié)構(gòu)化數(shù)據(jù)集的時候,如何處理呢?把非結(jié)構(gòu)化數(shù)據(jù)集當(dāng)做是沒有任何矩陣或數(shù)據(jù)幀的數(shù)據(jù)。不過,我們可以添加新的觀察點嗎?
假設(shè)你有一個新house的數(shù)據(jù)要加入到house?里。新house是“redwyne”,目前在“The Reach”區(qū)域?,F(xiàn)在,我們想在我們現(xiàn)有的house數(shù)據(jù)中添加這個新的觀察點。讓我們看看如何做。
輸入結(jié)果為:
正如你所見,新的redwyne已經(jīng)被添加到了house的數(shù)據(jù)框中了。
重要提示
1、有時候,我們需要從一個比源數(shù)據(jù)集有新列的數(shù)據(jù)集中添加一個觀察者,怎么辦?讓我們試著修改下數(shù)據(jù)集,看看這個怎么操作。
現(xiàn)在,house數(shù)據(jù)集包含兩個列(House,Region),領(lǐng)一個數(shù)據(jù)集house_new包含列(House,Region,Religion).想一想,Religion列不在house的數(shù)據(jù)集中,但我們需要合并這些數(shù)據(jù)集,如何做呢?
我們看到house數(shù)據(jù)中增加了Religion列,而且原有的數(shù)據(jù)中該列的值都為NaN。
1.這個操作只適應(yīng)于Python的用戶。
繼續(xù)要點1,增加了新的house到舊的數(shù)據(jù)集中,我們得到了重復(fù)的索引值,這個是個明顯的問題。
現(xiàn)在,如果我們試著訪問第一個元素的話,我們將得到什么內(nèi)容呢?思考一下:
結(jié)果輸出如下:
我們看到了2個元素,為什么會這樣呢?
折是因為,在合并了兩個數(shù)據(jù)集之后,新的觀察點并沒有根據(jù)新的數(shù)據(jù)集進行更新。因此,如果我們試著訪問第一個元素的時候,就出現(xiàn)了如上的結(jié)果。為了解決這個問題,我們也需要處理索引。可以這樣做:
結(jié)果如下:
正如我們所見,現(xiàn)在的索引已經(jīng)和原來的索引不同了,現(xiàn)在,我們可以訪問任意行而不會有問題了。
練習(xí)1:如果house有個額外的變量,如何將house_new的數(shù)據(jù)集通過append或者concat操作合并到一起?
練習(xí)2:寫一個代碼,把house的數(shù)據(jù)添加到house_new中。(house_new的觀察點在上面)
挑戰(zhàn)2:刪除觀察點
刪除行
假設(shè)我們有一個候選數(shù)據(jù)集,包括每一個家庭的繼承者信息。他們根據(jù)在同一家庭的年齡進行降序排列。兩個家庭之間沒有順序。
現(xiàn)在我們想移除candidates數(shù)據(jù)集中的最上面兩行。
輸出如下:
基于條件刪除行
在電視劇中,Robb Stark在婚禮上被殺了,因此他已經(jīng)死了,他不能成為Stark House的繼承人,我們需要從這個數(shù)據(jù)集中將他刪除掉。
任務(wù):準備一個新的Robb Stark被移除的客戶清單。
輸出如下:
挑戰(zhàn)3:添加水平列
很多時候,一個數(shù)據(jù)集在不同的文件中。每一個文件包含一些唯一的信息。我們需要合并這些信息獲取最大的信息。
在這種情況下,我們?nèi)绾螞Q定我們應(yīng)該應(yīng)用什么樣的合并技術(shù)?
答案是,它取決于問題的要求。下面是不同類型的合并操作和在不同情況下如何決定合并技術(shù)應(yīng)用的見解。
有些時候問題是連續(xù)的。
讓我們來看這個例子,需要合并的數(shù)據(jù)結(jié)構(gòu)如下。
在這種情況下,我們需要使用另一個的數(shù)據(jù)映射索引。
為了得到每個家族的軍事力量,我們需要將military的數(shù)據(jù)加入到house中。
結(jié)果如下:
這不是很簡單?實際上,因為索引定位是相似的,這就是為什么我們能夠合并這兩個數(shù)據(jù)集,但是并不是始終是這樣。事實上,這在任何數(shù)據(jù)科學(xué)競賽中都很少會發(fā)生。挑戰(zhàn)4將說明真正的麻煩。
挑戰(zhàn)4:基于共同的屬性增加列
現(xiàn)在,如何合并一個索引沒有關(guān)聯(lián)度的數(shù)據(jù)集?
在這種情況下,總有一個共同的屬性(或多個密鑰)在我們要組合的數(shù)據(jù)集上。但是,你需要找到數(shù)據(jù)的共同的屬性。它們可以是列或索引。
提示:更多的情況下,相同的屬性一般是ID,請留意這個。有很多的不同的方法去合并上面提到的問題?,F(xiàn)在我們有house數(shù)據(jù)集和candidates數(shù)據(jù)集。為了告訴你在這些應(yīng)用操作過程中有不同的變化,我要解決數(shù)據(jù)集的各種不同的問題和情況。
考慮一下如下的問題應(yīng)該如何解決。
問題:哪一個繼承者有最大的軍事力量?
只從candidates數(shù)據(jù)集中看繼承者的名字是不能回答這個問題的,為了回答這個問題,我們必須從house的數(shù)據(jù)集中擴展military這個信息。
我們?nèi)绾巫瞿??他們的索引沒有一一對應(yīng),在他們之間有任何普通屬性嗎?
是的,兩個數(shù)據(jù)集中都有house列?,F(xiàn)在我們將看到我們?nèi)绾位谄胀ǖ牧袑傩院喜⑸厦娴臄?shù)據(jù)集。
輸出如下:
通過看上面的數(shù)據(jù)框架,我們得出Daenerys Targaryen是武力最厲害的家族。但,為什么Jorah Mormont得到的是NaN呢?
這兒有一些需要注意的事情。
- 第一行代碼中,我們用了都存在于兩個數(shù)據(jù)集中的“on/by=”House””列,實際上,我們是基于特殊key合并的數(shù)據(jù)。當(dāng)我們在第二行用left_on/by.x& right_on/by.y時,他們有不同的列名。
- 在兩個代碼中,我們用how=’left’/all.x=TRUE在主鍵House中,只左關(guān)聯(lián)了數(shù)據(jù)。我們使用左關(guān)聯(lián)主要是因為我們想得到所有武力的信息。
- Tyrell家族在合并數(shù)據(jù)集中沒有數(shù)據(jù),因為家族Tyrell沒有繼承人數(shù)據(jù),而左關(guān)聯(lián)則需要這個。
- 家族Mormont在House數(shù)據(jù)中沒有任何信息,因此繼承人Jorah Mormont 在合并之后的數(shù)據(jù)中是NaN.
在這里使用左合并主要是因為我們只想要繼承者的信息,因此,在上面的代碼中,candidates是左數(shù)據(jù)集,是使用它的House主鍵。
左關(guān)聯(lián)
注:我已經(jīng)在標題和注解中使用“merge”。它是我將用于組合或連接數(shù)據(jù)集的通用術(shù)語。代碼中的“merge”是合并、連接或合并的語法。
問題:?列出所有的家族的軍事實力和合法的繼承人
現(xiàn)在,我們必須關(guān)聯(lián)每個家族的信息,因此,軍事力量已經(jīng)在house數(shù)據(jù)集中了,我們要做的就是找出在candidates數(shù)據(jù)集中的每個家族的繼承人了。
換句話,我們需要從candidates數(shù)據(jù)集中提取繼承人名字,并且匹配到正確的家族中??纯创a:
這將提供每個家族所有的候選人,連同他們的軍事實力與原候選人。在candidates數(shù)據(jù)集中,一個特定家族的一個老年人被匹配在其他家族上。我們也可以執(zhí)行一個正確的合并操作來做同樣的事情。
輸出如下:
這里使用了?how=”right”/all.y=True?只從右數(shù)據(jù)中關(guān)聯(lián)數(shù)據(jù)。.
右鏈接
問題:列出至少有一個繼承人的家族。
有時候,我們僅僅只需要兩個數(shù)據(jù)集合并之后的一部分數(shù)據(jù)。也就是說,我們只需要house和candidates的共有的部分,而不是刪除掉合并之后缺少數(shù)據(jù)的觀測點,直接語句如下:
輸出如下:
這里我們用了 how=”inner”/all=FALSE 從兩個數(shù)據(jù)集中取共有數(shù)據(jù)。
內(nèi)關(guān)聯(lián)
?問題:列出關(guān)于家族和繼承者的所有可用信息?
我們需要所有的關(guān)于candidates和houses的所有數(shù)據(jù)。不管信息是否可用。也就是說,我們想要house和candidates兩個數(shù)據(jù)集的聯(lián)合信息。
我們可以用下面的代碼:
這里我們用?how=”outer”/all=True 來聯(lián)合兩個數(shù)據(jù)集的數(shù)據(jù)。.
聯(lián)合關(guān)聯(lián)
?挑戰(zhàn)5:基于觀察序列(指數(shù))添加列
有時一般的屬性或者鍵值是兩個數(shù)據(jù)集的索引或者索引在一個數(shù)據(jù)集中,列在另外一個數(shù)據(jù)集中。我們準備處理一個簡單的問題,兩個鍵值都是索引。然后,我們必須找出如下給出的練習(xí)題中的一個解決方案。假設(shè)數(shù)據(jù)集如下:
我們先通過如下代碼合并兩個數(shù)據(jù)集。
對于兩個基于基本索引的數(shù)據(jù)集合并來說,聯(lián)合函數(shù)是一個方便的方法。但是,我們能通過使用on?參數(shù)來合并一個鍵值是列的數(shù)據(jù)集。
對于兩個基于基本索引的數(shù)據(jù)集合并來說,聯(lián)合函數(shù)是一個方便的方法。但是,我們能通過使用on?參數(shù)來合并一個鍵值是列的數(shù)據(jù)集。
注意:如果你正在合并的數(shù)據(jù)有一個相同的不同于一般屬性列名稱呢?將會發(fā)生什么?你能夠很容易的處理,看看如下的例子:
如果你運行合并代碼,默認會加一些后綴(_x,_y),除非你加入自己的后綴。
結(jié)果如下:
練習(xí)3:編寫基于house數(shù)據(jù)集的左連接的代碼
挑戰(zhàn)6:刪除重復(fù)的觀者點
讓我們帶著問題開始這個章節(jié):
現(xiàn)在,我們有兩個如下數(shù)據(jù)集:house和candidates。你知道每一個家族的軍事實力的下一個繼承人的細節(jié)嗎?
現(xiàn)在,使用house鍵從candidates數(shù)據(jù)集中使用合并操作。
正如你所看到的,有和我們的問題無關(guān)的重復(fù)數(shù)據(jù)。你必須了解數(shù)據(jù)集的結(jié)構(gòu)和用于合并的方法。否則,你將得到一個你認為可以進行分析的數(shù)據(jù)集,但它卻不是你想要的,并且會影響結(jié)果輸出。
花一分鐘想想這個問題的可能解決辦法。
為了解決這個問題,我們可以提供好幾種方法,看看我們的解決方法:
1、刪除掉重復(fù)值:我們可以通過保留candidate數(shù)據(jù)中最上面的第一個數(shù)據(jù)的方式刪除其他冗余的數(shù)據(jù)。我們使用第一個數(shù)據(jù)是因為candidates是根據(jù)年齡倒序排列的。因此,最年長的孩子在最上面的位置。如下是代碼:
現(xiàn)在,我們合并兩個數(shù)據(jù)集。
輸出如下:
正如我們看到的,從家族Stark中移除了Arya Stark,從家族Lannister中移除了“Cersi Lannister,
2、合并重復(fù)項:讓我們看看例子。
假設(shè)一個家族中有兩個成員,每個成員都單獨有軍事力量,如給出的家族數(shù)據(jù)集中,Starks有2萬個士兵,Arya Stark和Robb Stark也各有2萬個士兵。
但當(dāng)形成每個家族最有權(quán)力的繼承人的列表的時候,最年長的繼承者有第一選擇權(quán)繼承皇位,因此,我們僅需要一個家族一個繼承人即可。
我們?nèi)绾我瞥哂嗄??通過上面簡單的刪除冗余的方法就會得到錯誤的數(shù)據(jù)。因此我們必須對一個家族的每個成員增加軍事力量。所以,需要對不同的問題提供不同的技術(shù)。
挑戰(zhàn)7:刪除列
在合并數(shù)據(jù)集之后,我們最終得到了有好多列的數(shù)據(jù)集,一些列是沒有用的,或者已經(jīng)在其他數(shù)據(jù)中有了這個信息。
假設(shè)我們的數(shù)據(jù)集如下:
這個數(shù)據(jù)集顯示了兩個非常相似的變量是 Region_left 和Region_right.,他們兩個中的Region_right.是沒什么用的,我們想刪除這個列。
輸出如下:
挑戰(zhàn)8:修改數(shù)據(jù)幀的值
修改一個特殊元素:
我們的工作還沒有完成,還有很多我們需要關(guān)注的不規(guī)則的數(shù)據(jù)。一個數(shù)據(jù)集可能包含不正確的信息,我們從上章節(jié)的最后合并了一個數(shù)據(jù)集,其中Arya Stark是在North區(qū)域的,但數(shù)據(jù)顯示她的區(qū)域是Westros。
我們必須修改區(qū)域Arya Stark 為 North。
輸出如下:
在這個操作結(jié)束之后,區(qū)域?Arya Stark修改為了North
基于條件的元素修改:
在我們的數(shù)據(jù)集中,區(qū)域Westros 是很多領(lǐng)域的范稱,因此,我們必須修改所有的Westros為Kings Landing,看看怎么做:
輸出如下:
Challenge 9: 重命名列名稱
我們已經(jīng)完成了所有挑戰(zhàn),最后當(dāng)你想修改一個列明的時候你已經(jīng)有了一個解決方案。在我們的數(shù)據(jù)集中,我們想修改一個列明從Region_left改為Region。
如下是我們修改的原表。
修改列名稱的代碼如下:
輸出如下:
結(jié)束。
如果你已經(jīng)讀到這一行,我想稱贊你的耐心和毅力,表示你已經(jīng)了解了這些挑戰(zhàn)。我認為所有合并、聯(lián)合、使用數(shù)據(jù)集的各種類型都已經(jīng)包含了。因此,在這些挑戰(zhàn)的工作將使你的知識足夠全面,以應(yīng)付任何情況。
為了獲得最佳效果,請確保你做這9個挑戰(zhàn)和4個練習(xí)。如果有別的事情,你認為可以做得更好,可以自由選擇。
你喜歡閱讀這篇文章嗎?你是否遵循一個不同的方法/包/庫來執(zhí)行這些會談。我很想和你在評論中互動。
End.
轉(zhuǎn)載請注明來自36大數(shù)據(jù)(36dsj.com):36大數(shù)據(jù) » 實戰(zhàn)教程:在R和Python中,9個數(shù)據(jù)合并和數(shù)據(jù)子集操作上的挑戰(zhàn)
愛盈利-運營小咖秀 始終堅持研究分享移動互聯(lián)網(wǎng)App數(shù)據(jù)運營推廣經(jīng)驗、策略、全案、渠道等純干貨知識內(nèi)容;是廣大App運營從業(yè)者的知識啟蒙、成長指導(dǎo)、進階學(xué)習(xí)的集聚平臺;