用Python做資料科學時容易忘記的八個要點!

大資料文摘發表於2018-07-23

如果你發覺自己在程式設計時一次又一次地查詢相同的問題、概念或是語法,你不是一個人!

雖然我們在StackOverflow或其他網站上查詢答案是很正常的事情,但這樣做確實比較花時間,也讓人懷疑你是否完全理解了這門程式語言。

我們現在生活的世界裡,似乎有著無限的免費資源,而你只需要一次搜尋即可獲得。然而,這既是這個時代的幸事,也是一種詛咒。如果沒能有效利用資源,而是對它們過度依賴,你就會養成不良的習慣,長期處於不利境地。

用Python做資料科學時容易忘記的八個要點!

當我谷歌一個問題,發現有人提了同樣問題,但下面只有一個回答,而且2003年以後就再也沒有新的答案的時候,我真是和那個提問者同病相憐!弱小,可憐又無助!

用Python做資料科學時容易忘記的八個要點!

“你是誰!你在哪兒!最後你發現了啥!”

就個人而言,我發現自己也是多次從類似的技術問答中找程式碼(見上文插圖漫畫);而不是花時間學習和鞏固概念,以便下次可以自己把程式碼寫出來。

網上搜尋答案是一種懶惰的行為,雖然在短期內它可能是最簡便的途徑,但它終究不利於你的成長,並且會降低工作效率和對語法的熟知能力(咳咳,面試的時候這些知識很重要)。

目標

最近,我一直在Udemy學習名為Python for Data Science and Machine Learning的資料科學線上課程。在該系列課程的早期課件中,我想起了用Python做資料分析時一直被我忽略的一些概念和語法。

為了一勞永逸地鞏固我對這些概念的理解,併為大家免去一些StackOverflow的搜尋,我在文章中整理了自己在使用Python,NumPy和Pandas時總是忘記的東西。

我為每個要點提供了簡短的描述和示例。為了給讀者帶來福利,我還新增了視訊和其他資源的連結,以便大家更深入地瞭解各個概念。

單行List Comprehension

每次需要定義某種列表時都要寫for迴圈是很乏味的,好在Python有一種內建的方法可以用一行程式碼解決這個問題。該語法可能有點難以理解,但是一旦熟悉了這種技巧,你就會經常使用它。

用Python做資料科學時容易忘記的八個要點!

 * Line 8是對for loop的單行簡化

請參閱上圖和下文的示例,比較一下在建立列表時,你通常使用的for迴圈樣板和以單行程式碼建立這二者之間的差別。

x = [1,2,3,4] out = [] for item in x:    out.append(item**2) print(out) [1, 4, 9, 16] # vs. x = [1,2,3,4] out = [item**2 for item in x] print(out) [1, 4, 9, 16]

Lambda 函式

程式設計的過程中經常為了實現最後的功能,建立一個又一個階段性的函式,這些函式往往就只用一兩次。這個過程很煩人。這時候Lambda函式來搭救你了!

Lambda函式用於在Python中建立小型的,一次性的和匿名的函式物件。基本上,它們可以讓你“在不建立新函式的情況下”建立一個函式。

lambda函式的基本語法如下:

lambda arguments: expression

所以,只要給它一個表示式,lambda函式可以執行所有常規函式可執行的操作。請看下面的簡單示例和後文中的視訊,以更好地感受lambda函式強大的功能。

double = lambda x: x * 2 print(double(5)) 10

Map和Filter

一旦掌握了lambda函式,並學會將它們與map和filter函式配合使用,你將擁有一個強大的工具。

具體來說,map函式接受一個列表並通過對每個元素執行某種操作來將其轉換為新列表。在下面的示例中,它遍歷每個元素並將其乘以2的結果對映到新列表。請注意,這裡的list函式只是將輸出轉換為列表型別。

# Map seq = [1, 2, 3, 4, 5] result = list(map(lambda var: var*2, seq)) print(result) [2, 4, 6, 8, 10]

filter函式需要的輸入是列表和規則,非常類似於map,但它通過將每個元素與布林過濾規則進行比較來返回原始列表的子集。

# Filter seq = [1, 2, 3, 4, 5] result = list(filter(lambda x: x > 2, seq)) print(result) [3, 4, 5]


Arange和Linspace

要建立快速簡單的NumPy陣列,可以檢視arange和linspace函式。它們都有特定的用途,但在這裡我們看中的是它們都輸出Numpy陣列(而非其使用範圍),這通常更容易用於資料科學。

Arange在給定的範圍內返回間隔均勻的值。除了起始值和終止值,你還可以根據需要定義步長或資料型別。請注意,終止值是一個“截止”值,因此它不會被包含在陣列輸出中。

# np.arange(start, stop, step) np.arange(3, 7, 2) array([3, 5])

Linspace與Arange非常相似,但略有不同。Linspace是在指定的範圍內返回指定個數的間隔均勻的數字。所以給定一個起始值和終止值,並指定返回值的個數,linspace將根據你指定的個數在NumPy陣列中劃好等分。這對於資料視覺化和在定義圖表座標軸時特別有用。

# np.linspace(start, stop, num) np.linspace(2.0, 3.0, num=5) array([ 2.0,  2.25,  2.5,  2.75, 3.0])

Axis的真正意義

在Pandas中刪除列或在NumPy矩陣中對值進行求和時,可能會遇到這問題。即使沒有,那麼你也肯定會在將來的某個時候碰到。我們現在來看看刪除列的示例:

df.drop('Row A', axis=0) df.drop('Column A', axis=1)

在我知道自己為什麼要這樣定義座標軸之前,我不知道我寫了多少次這行程式碼。你可以從上面看出,如果要處理列,就將axis設為1,如果要處理行,則將其設為0。

但為什麼會這樣呢?我記得我最喜歡的解釋是這個:

df.shape (# of Rows, # of Columns)

從Pandas的dataframe呼叫shape屬性時會返回一個元組,其中第一個值表示行數,第二個值表示列數。如果你想想在Python中是如何建立索引的,即行為0,列為1,會發現這與我們定義座標軸值的方式非常相似。很有趣吧!


Concat, Merge, 和Join

如果你熟悉SQL,那麼這些概念對你來說可能會更容易。無論如何,這些功能基本上就是以特定方式組合dataframe的方法。可能很難評判在什麼時候使用哪個最好,所以讓我們都回顧一下。

Concat允許使用者在其下方或旁邊附加一個或多個dataframe(取決於你如何定義軸)。

用Python做資料科學時容易忘記的八個要點!

Merge可以基於特定的、共有的主鍵(Primary Key)組合多個dataframe。

用Python做資料科學時容易忘記的八個要點!

Join,就像merge一樣,可以組合兩個dataframe。但是,它根據它們的索引進行組合,而不是某些特定的主鍵。

用Python做資料科學時容易忘記的八個要點!

大家可以檢視很有幫助的Pandas文件,瞭解語法和具體示例和你可能會遇到的特殊情況。

Pandas Apply

apply類似於map函式,不過它是用於Pandas DataFrames的,或者更具體地說是用於Series的。如果你不熟悉也沒關係,Series在很大程度上與NumPy中的陣列(array)非常相似。

Apply會根據你指定的內容向列或行中的每個元素髮送一個函式。你可以想象這是多麼有用,特別是在對整個DataFrame的列處理格式或運算數值的時候,可以省去迴圈。


透視表

最後要說到的是透視表。如果你熟悉Microsoft Excel,那麼你可能已經聽說過資料透視表。Pandas內建的pivot_table函式將電子表格樣式的資料透視表建立為DataFrame。請注意,透視表中的維度儲存在MultiIndex物件中,用來宣告DataFrame的index和columns。

結語

我的這些Python程式設計小貼士就到此為止啦。我希望我介紹的這些在使用Python做資料科學時經常遇到的重要但又有點棘手的方法、函式和概念能給你帶來幫助。

而我自己在整理這些內容並試圖用簡單的術語來闡述它們的過程中也受益良多。

相關報導:

https://towardsdatascience.com/python-for-data-science-8-concepts-you-may-have-forgotten-i-did-825966908393

相關文章