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