用在資料科學上的 Python:你可能忘記的 8 個概念

嬌兮心有之發表於2018-12-16

問題

如果你在程式設計的時候發現自己一遍又一遍的搜尋同一個問題、概念或者語法,那麼你並不孤單。

Python學習資料或者需要程式碼、視訊加Python學習群:960410445

我自己也經常這樣。

雖然在 StackOverflow 和其他資源網站搜尋很正常,但是它對你的好處比較小,並且會增加你理解這門語言的困難。

我們生活在看起來有無限資訊和無窮免費資源的時代,似乎搜尋一下就把問題解決了。然而,這可能既是祝福也是詛咒。如果不能有效的管理和整合,過度依賴這些資源會阻擋我們長期進步。

來源:xkcd

我發現自己有幾次從論壇上覆制程式碼並修改,而不是花時間去學習和鞏固我下次可能遇見的知識點。

這個方法比較懶。雖然這個方法可能是短期阻力比較小的一個,但是這最終會傷害你的成長、效率和回想語法的能力。

目標

最近我在 Udemy 通過了一個名為「資料科學和機器學習中的 Python」的線上課程。通過這一系列的課程,我整理了一些我在 Python 資料分析中所忽視的語法和概念。

為了鞏固我對這些理念的理解和便於你們在 StackOverFlow 進行搜尋,這裡我整理出了我在使用 Python,Numpy,Pandas 中的一些知識點。

對於每一個知識點我都給出了簡短的描述和例子。另外,我也給出了視訊和其他的資料的連結,這些有助於加深這些知識點的理解。

列表推導式 

在寫迴圈的時候,每次定義一堆的列表是相當無聊的。幸運的是,Python 內建了一種名為列表推導式的方法,這種方法僅僅使用一行程式碼就可以解決這個問題。列表推導式剛開始對你來說可能有些困難,但是你一旦熟悉,你就會經常使用。

來源: Trey Hunner

下面的第一個例子是求每一個元素平方的的普通寫法,第二個是列表推導式的寫法。

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 函式,然後將 Lambda 函式和 map,filter 函式一起使用,你會發現威力巨大。 具體的說,map 函式通過對列表中的每一個元素進行操作,將列表轉換成一個新的列表。在下面的這個例子中,map 函式將每一個元素乘以 2,變成一個新的元素。注意這裡的 list 函式只是簡單的將輸出結果轉化為 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 函式通過比較每一個元素是否為真從原始列表中抽取子集。

# Filter

seq = [1, 2, 3, 4, 5]

result = list(filter(lambda x: x > 2, seq))

print(result)[3, 4, 5]

Python: Lambda, Map, Filter, Reduce Functions :

https://youtu.be/cKlnR-CB3tk

Arange 函式 和 Linspace 函式 

快速建立簡單的 NumPy 陣列,使用 arange 和 linspace 函式最合適不過了。 它們都有各自特定的功能,但在這裡使用(不是使用範圍)在於其產生的 NumPy 陣列,對於資料科學通常更容易操作。 

Arange 函式,根據 start 和 stop 指定的範圍以及 step 設定的步長,生成指定間隔的均勻間隔序列。除了開始值 start 和結束值 stop,還可以根據需要定義步長 step 或資料型別。這裡需要注意,結束值是一個「截止」值,所以不會包含在生成的陣列中。

# np.arange(start, stop, step)

np.arange(3, 7, 2)

array([3, 5])

Linspace 函式非常相似,但略有不同。它根據 start 和 stop 指定的範圍以及 num 設定的個數,生成指定個數的均勻間隔序列。因此,給定一個開始值 start 和結束值 stop,以及個數值 num,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('Column A', axis=1)

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

在我真正知道為什麼需要宣告軸是什麼之前,我編寫了無數次這行程式碼。從上面的程式碼中,你可以推斷出,如果對列進行操作需要將 axis 設定為 1,對行操作則將其設定為 0。但這是為什麼呢?我喜歡探求原因,或者至少我記得這個:

df.shape

(# of Rows, # of Columns)

檢視 Pandas 中 dataframe 的 shape 屬性會返回一個元組,其中第一個值表示行數,第二個值表示列數。想想 Python 中的索引方法——行為 0 列為 1,這與我們宣告軸的方法非常相似。很有意思,對吧?

How do I use the "axis" parameter in pandas?:

https://youtu.be/PtO3t6ynH-8

Concat 函式、Merge 函式和 Join 函式

如果你熟悉 SQL,那麼這些函式方法可能會更容易理解。其實它們本質上都只是以一定方式合併 dataframe 的方法。哪種情況下用哪個最好很難說,所以讓我們再回顧一下。

Concat 函式可以在下方或旁邊合併一個或多個 dataframe(取決於如何定義軸)。

Merge 函式在作為主鍵的指定公共列上合併多個 dataframe。

Join 函式合併兩個 dataframe 的方法與 merge 函式類似。但是,它根據索引合併 dataframe,而不是某些指定列。

可以通過檢視優秀的 Pandas 文件,瞭解特定用法和更具體的示例,以及你可能遇到的一些特殊用法。

Youtube:

https://youtu.be/XMjSGGej9y8

Pandas 的 Apply 函式

你可以把 apply 函式想做地圖功能,但它只對 Pandas 的 DataFrame 或者更具體地說是 Series 進行操作。如果你不熟悉 Series,其實它在很多方面都與 NumPy 陣列非常相似。

Apply 函式會對你指定的列或行中每個元素作用一個函式。你可以想象到這是多麼有用,尤其式當你對整個 DataFrame 列進行歸一化和元素值操作,而不必進行迴圈。

Python Pandas Youtube 教學視訊:

https://youtu.be/P_q0tkYqvSk

Pivot Tables 資料透視表

最後但同樣重要的是資料透視表。如果你熟悉 Microsoft Excel,那你可能已經在某些方面聽說過資料透視表。Pandas 內建的 pivot_table 函式可以將電子表格樣式的資料透視表建立為 DataFrame。需要注意的是,資料透視表中的級別儲存在建立的 DataFrame 層次索引和列中。

結語

我希望你在使用 Python 進行資料科學操作時,可以通過經常遇到的一些重要但有些棘手的方法、函式和概念對上述方法有效地慢慢記憶。就我個人來說,寫出這些並試圖用簡單的術語解釋它們也更加加深了我對這些知識的理解。

相關文章