3分鐘搞懂Python 數(shù)據(jù)分析庫 Pandas
Pandas 通常用于快速簡(jiǎn)單的數(shù)據(jù)操作、聚合和可視化。在這篇文章中,我將概述如何學(xué)習(xí)這一工具的使用。
Pandas 官網(wǎng)鏈接:https://pandas.pydata.org/
首先要給那些不熟悉 Pandas 的人簡(jiǎn)單介紹一下,Pandas 是 Python 生態(tài)系統(tǒng)中最流行的數(shù)據(jù)分析庫。它能夠完成許多任務(wù),包括:
讀 / 寫不同格式的數(shù)據(jù)
選擇數(shù)據(jù)的子集
跨行 / 列計(jì)算
尋找并填寫缺失的數(shù)據(jù)
在數(shù)據(jù)的獨(dú)立組中應(yīng)用操作
重塑數(shù)據(jù)成不同格式
合并多個(gè)數(shù)據(jù)集
先進(jìn)的時(shí)序功能
通過 matplotlib 和 seaborn 進(jìn)行可視化操作
盡管 Pandas 功能強(qiáng)大,但它并不為整個(gè)數(shù)據(jù)科學(xué)流程提供完整功能。Pandas 通常是被用在數(shù)據(jù)采集和存儲(chǔ)以及數(shù)據(jù)建模和預(yù)測(cè)中間的工具,作用是數(shù)據(jù)挖掘和清理。
數(shù)據(jù)科學(xué)管道
對(duì)于典型的數(shù)據(jù)科學(xué)家而言,Pandas 在數(shù)據(jù)管道傳輸過程中扮演著非常重要的角色。其中一個(gè)量化指標(biāo)是通過社區(qū)討論頻率趨勢(shì)(Stack Overflow trends app (?https://insights.stackoverflow.com/trends?) )。
現(xiàn)在,Pandas 在 Stack Overflow 上的活動(dòng)居 Python 數(shù)據(jù)科學(xué)庫之首,占整個(gè)站點(diǎn)新問題提交總數(shù)的 1%。
Stack Overflow 的濫用
從上面的圖標(biāo)中,我們發(fā)現(xiàn)很多人都在使用 Pandas,但同時(shí)也對(duì)此很困惑。我在 Stack Overflow 上回答了關(guān)于 Pandas 的約 400 個(gè)問題,親眼目睹了大家對(duì)這個(gè)庫理解得多糟。Stack Overflow 給程序員提供了極大的便捷,但同時(shí)也產(chǎn)生了一個(gè)巨大的缺點(diǎn)。因?yàn)槌绦騿T能瞬間找到問題的答案并獲得滿足感,導(dǎo)致人們不愿意仔細(xì)閱讀自己擁有的文獻(xiàn)和其他資源了。其實(shí)我建議程序員每年花幾個(gè)星期的時(shí)間不用 Stack Overflow 解決問題。
手把手教你學(xué) Pandas
幾個(gè)星期前有人詢問我如何練習(xí)使用 Pandas,因此我在 r/datascience subreddit 上發(fā)布了一個(gè)簡(jiǎn)單的指南。下面的內(nèi)容將詳細(xì)說明那篇文章表達(dá)的信息。
首先,你應(yīng)該擺正目標(biāo)。你的目標(biāo)不是真的要「學(xué)習(xí) Pandas」。了解如何在庫中執(zhí)行運(yùn)算是很有用的,但這和你在實(shí)際數(shù)據(jù)分析中需要用到的 Pandas 知識(shí)并不一樣。你可以將你的學(xué)習(xí)分為兩類:
獨(dú)立于數(shù)據(jù)分析,學(xué)習(xí) Pandas 庫
學(xué)習(xí)在實(shí)際數(shù)據(jù)分析中使用 Pandas
打個(gè)比方,這兩者的區(qū)別類似于,前者是學(xué)習(xí)如何將小樹枝鋸成兩半,后者是在森林里砍一些樹。在我們?cè)敿?xì)討論之前,讓我們先總結(jié)一下這兩種方法。
獨(dú)立于數(shù)據(jù)分析,學(xué)習(xí) Pandas 庫:此方法主要包括閱讀、更關(guān)鍵的是探索 Pandas 官方文檔。(http://pandas.pydata.org/pandas-docs/stable/)
學(xué)習(xí)在實(shí)際數(shù)據(jù)分析中使用 Pandas:此方法涉及查找和收集真實(shí)世界的數(shù)據(jù),并執(zhí)行端到端的數(shù)據(jù)分析。Kaggle 數(shù)據(jù)集 是查找數(shù)據(jù)的好地方。不過我強(qiáng)烈建議你避免在流暢使用 Pandas 前使用 Kaggle 的機(jī)器學(xué)習(xí)組件。
交替學(xué)習(xí)
在你學(xué)習(xí)如何使用 Pandas 進(jìn)行數(shù)據(jù)分析的過程中,你應(yīng)該交替學(xué)習(xí) Pandas 文檔的基礎(chǔ)以及在真實(shí)數(shù)據(jù)庫處理中的 Pandas 運(yùn)用。這非常重要。否則,你很容易在掌握完成大部分任務(wù)所需的 Pandas 基礎(chǔ)知識(shí)之后對(duì)他們產(chǎn)生完全的依賴。但其實(shí)在更高級(jí)的運(yùn)算存在時(shí),這些基礎(chǔ)又顯得太笨重了。
從文檔開始
如果你此前從沒有接觸過 Pandas 但是有著 Python 的足夠的基礎(chǔ)知識(shí),我建議你從 Pandas 官方文檔開始。文檔寫得非常詳細(xì),現(xiàn)在共有 2195 頁。即使文檔的規(guī)模如此龐大,它還是沒有涵蓋每一個(gè)操作,當(dāng)然也不涵蓋你在 Pandas 中能使用的函數(shù) / 方法與參數(shù)的所有組合。
充分利用文檔
為了充分利用文檔,不要只閱讀它。我建議你閱讀其中的 15 個(gè) 部分。對(duì)每個(gè)部分,新建一個(gè) Jupyter notebook。如果你對(duì) Jupyter notebook 不太熟悉,請(qǐng)先閱讀來源于 Data Camp 的這篇文章:https://www.datacamp.com/community/tutorials/tutorial-jupyter-notebook
建立你的首個(gè) Jupyter notebook
請(qǐng)從「數(shù)據(jù)結(jié)構(gòu)入門(Intro to Data Structures)」這個(gè)章節(jié)開始。在你的 Jupyter notebook 旁邊打開這個(gè)頁面。當(dāng)你閱讀文檔時(shí),寫下(而不是復(fù)制)代碼,并且在筆記本中執(zhí)行。在執(zhí)行代碼的過程中,請(qǐng)?zhí)剿鬟@些操作,并嘗試探索使用它們的新方法。
然后選擇「索引和選擇數(shù)據(jù)(Indexing and Selecting Data)」這個(gè)部分。新建一個(gè) Jupyter notebook,同樣編寫、執(zhí)行代碼,然后探索你學(xué)到的不同操作。選擇數(shù)據(jù)是初學(xué)者最難理解的部分,我專門在 .locvs .iloc 上寫了一個(gè)長(zhǎng)篇文章(https://stackoverflow.com/questions/28757389/loc-vs-iloc-vs-ix-vs-at-vs-iat/47098873#47098873),你可能想從中看到另一個(gè)解釋。
在學(xué)習(xí)這兩個(gè)部分之后,你應(yīng)該能了解一個(gè) DataFrame 和一個(gè) Series 的組件,也能明白如何從數(shù)據(jù)中選擇不同的子集?,F(xiàn)在可以閱讀「10 minutes to pandas」,以獲得更加其他有用操作的廣泛概述。和學(xué)習(xí)所有部分一樣,請(qǐng)新建一個(gè) notebook。
按下 shift + tab + tab 獲得幫助
我經(jīng)常在使用 Pandas 時(shí)按下 shift + tab + tab。當(dāng)指針放在名稱中或是在有效 Python 代碼括號(hào)當(dāng)中時(shí),被指對(duì)象就會(huì)彈出一個(gè)小滾動(dòng)框顯示其文檔。這個(gè)小框?qū)ξ襾碚f十分有用,因?yàn)橛涀∷械膮?shù)名稱和它們的輸入類型是不可能的。
按下 shift + tab + tab,開啟 stack 方式的文檔
你也可以在「.」之后直接按下 tab 鍵,得到全部有效對(duì)象的下拉菜單
在 DataFrame ( df. ) 后按下 tab,獲得 200+ 有效對(duì)象列表
官方文檔的主要缺點(diǎn)
雖然官方文檔描述得非常詳盡,但它并不能很好地指導(dǎo)如何正確使用真實(shí)數(shù)據(jù)進(jìn)行數(shù)據(jù)分析。所有數(shù)據(jù)都是人為設(shè)計(jì)或者隨機(jī)生成的。真正的數(shù)據(jù)分析會(huì)涉及好幾個(gè)、甚至幾十個(gè) Pandas 操作串行。如果你只看文檔,你永遠(yuǎn)不會(huì)接觸到這些。使用文檔學(xué)習(xí) Pandas 呆板而機(jī)械,各個(gè)方法學(xué)起來相互獨(dú)立沒有聯(lián)系。
建立你的首次數(shù)據(jù)分析
在讀完上述三部分文檔之后,就可以首次接觸真實(shí)數(shù)據(jù)了。如前所述,我建議你從 Kaggle 數(shù)據(jù)集開始。你可以通過大眾投票熱度進(jìn)行挑選,例如選擇 TMDB 5000 Movie 數(shù)據(jù)集。下載數(shù)據(jù),然后在該數(shù)據(jù)集上新建一個(gè) Jupyter notebook。你可能目前并不能進(jìn)行高級(jí)的數(shù)據(jù)處理,但你應(yīng)該能聯(lián)系你在文檔的前三部分學(xué)到的知識(shí)。
檢視內(nèi)核
每一個(gè) Kaggle 數(shù)據(jù)集都有一個(gè)內(nèi)核(kernel)部分。不要被「內(nèi)核」這個(gè)名字迷惑了——它只是一個(gè)將 Kaggle 數(shù)據(jù)集放在 Python 或 R 語言處理的 Jupyter notebook。這是很好的學(xué)習(xí)機(jī)會(huì)。在你做了一些基本的數(shù)據(jù)分析之后,打開一個(gè)比較流行的 Python kernel,通讀其中的幾個(gè),把你感興趣的幾個(gè)代碼片段插入到自己的代碼里。
如果對(duì)某些問題不能理解,你可以在評(píng)論區(qū)提問。其實(shí)你可以創(chuàng)建自己的 kernel,不過現(xiàn)在,我覺得你還是在本地筆記本上工作比較好。
回歸官方文檔
當(dāng)你完成了你的第一個(gè) kernel 之后,你可以回歸文檔然后閱讀其他部分。下面是我建議的閱讀順序:
處理丟失的數(shù)據(jù)
分組:split-apply-combine 模式
重塑和數(shù)據(jù)交叉表
數(shù)據(jù)合并和連接
輸入輸出工具(Text,CSV,HDF5 …)
使用文本數(shù)據(jù)
可視化
時(shí)間序列 / 日期功能
時(shí)間差
分類數(shù)據(jù)
計(jì)算工具
多重索引 / 高級(jí)索引
上述順序與文檔主頁左側(cè)的順序明顯不同,其中涵蓋了我認(rèn)為最重要的主題。文檔中的某些部分沒有在上面列出,你可以在之后自行閱讀他們。
在閱讀上述部分的文檔并完成大約 10 個(gè) Kaggle kernel 之后,你應(yīng)該可以無障礙地弄懂 Pandas 的機(jī)制,同時(shí)可以順利地進(jìn)行實(shí)際數(shù)據(jù)分析。
學(xué)習(xí)探索性數(shù)據(jù)分析
通過閱讀許多流行的 Kaggle kernel,你會(huì)在建立良好數(shù)據(jù)分析方面收獲豐富。對(duì)于更加正式和嚴(yán)格的方法,我建議你閱讀 Howard Seltman 在線書籍的第四章節(jié),「Exploratory Data Analysis」。(http://www.stat.cmu.edu/~hseltman/309/Book/chapter4.pdf)
建立自己的 Kernel
你應(yīng)該考慮在 Kaggle 上創(chuàng)建自己的 kernel。這是強(qiáng)制自己將程序?qū)懙们逦暮梅椒āMǔ?,那些你自己寫的代碼都亂糟糟的沒有順序,對(duì)他人(包括未來的自己)來說都毫無可讀性。但當(dāng)你在網(wǎng)上發(fā)表 Kernel 的時(shí)候,我會(huì)建議你做得好一些,就像是期待你現(xiàn)在或未來老板讀取那樣。你可以在開頭寫一個(gè)執(zhí)行總結(jié)或摘要,然后用注釋解釋每個(gè)代碼塊。我通常會(huì)寫一個(gè)探索性但混亂的程序,然后再寫一個(gè)完全獨(dú)立可讀的程序作為最終產(chǎn)品。這是我的一位學(xué)生在 HR analytics 數(shù)據(jù)集上寫的 kernel:https://www.kaggle.com/aselad/why-are-our-employees-leaving-prematurely
不要只是依賴 Pandas,試著掌握它
一個(gè)把 Pandas 用的過得去的人和一個(gè)掌握 Pandas 的人有很大的區(qū)別。Pandas 的常規(guī)用戶通常只能寫比較差的代碼,因?yàn)?Pandas 有多種功能和多種方式去實(shí)現(xiàn)同樣的結(jié)果。編寫簡(jiǎn)單的程序也很容易得到你的結(jié)果,但其實(shí)效率非常低。
如果你是一個(gè)使用 Python 的數(shù)據(jù)科學(xué)家,你可能已經(jīng)頻繁使用 Pandas。所以你應(yīng)該把掌握 Pandas 這件事擺在重要的位置上,它能夠?yàn)槟銊?chuàng)造很多價(jià)值。
你可以在下面的鏈接中獲得許多有趣的技巧:https://stackoverflow.com/questions/17095101/outputting-difference-in-two-pandas-dataframes-side-by-side-highlighting-the-d/47112033#47112033
使用 Stack Overflow 檢驗(yàn)?zāi)愕闹R(shí)
如果你不能回答 Stack Overflow 的關(guān)于一個(gè) Python 庫的大部分問題,你就不算真正了解它。這種論斷可能有點(diǎn)絕對(duì),但是大體說來,Stack Overflow 為特定了解一個(gè)庫提供了很好的測(cè)試平臺(tái)。Stack Overflow 上有超過 50000 個(gè)帶有 Pandas 標(biāo)簽的問題,所以你有一個(gè)無窮無盡的數(shù)據(jù)庫能建立你對(duì) Pandas 的知識(shí)。
如果你從沒有在 Stack Overflow 上回答過問題,我建議你看看那些已有答案的來問題,并且嘗試只通過文檔來回答他們。當(dāng)你覺得你可以將高質(zhì)量的回答整合起來的時(shí)候,我建議你回答一些沒有被解答的問題。在 Stack Overflow 回答問題是鍛煉我的 Pandas 技能的最佳方式。
完成你自己的項(xiàng)目
Kaggle kernel 非常棒,但最終你需要處理一個(gè)獨(dú)一無二的任務(wù)。第一步是尋找數(shù)據(jù)。其中有許多數(shù)據(jù)資源,如:
http://data.gov
data.world
紐約公開數(shù)據(jù),休斯頓公開數(shù)據(jù),丹佛公開數(shù)據(jù)——大多數(shù)美國(guó)大城市都開放了數(shù)據(jù)門戶。
找到想要探索的數(shù)據(jù)集之后,繼續(xù)用相同的方式創(chuàng)建 Jupyter notebook,當(dāng)你有一個(gè)很好的最終成果時(shí),可以將它發(fā)布到 github 上。
總結(jié)
總之,作為一個(gè)初學(xué)者,我們需要使用文檔學(xué)習(xí) Pandas 運(yùn)算的主要機(jī)制,使用真實(shí)的數(shù)據(jù)集,從 Kaggle kernel 開始學(xué)習(xí)做數(shù)據(jù)分析,最后,在 Stack Overflow 上檢驗(yàn)?zāi)愕闹R(shí)。