學習Python中,注重這8個小細節,讓你在大資料領域事半功倍
每個人都會遇到這個問題。
學習資料科學的過程,從來就不是一帆風順的。在寫程式碼的時候,你是否也經常不得不反覆搜尋同一個問題,同一個概念,甚至同一個語法結構的特性呢?對,你不是一個人在戰鬥。
我也一直在同樣的情況裡掙扎著。
雖然遇到問題上 StackOverflow 搜一搜是相當正常的,但比起切實掌握理解語言特性的情況,不斷重複的遇到問題+搜來搜去,會嚴重拖慢你的速度。
如今,無窮無盡的免費資源時時刻刻充斥著網際網路,一搜即得。然而,對初學者,這既是一種祝福,也是一個詛咒。如果不經過有效管理,過度依賴網路資源會讓你養成糟糕的習慣,從長遠上影響了你的成長。
歐剃漢化
拿我自己來說,我常常從許多內容差不多的帖子裡複製程式碼下來使用,而不願意花時間和精力去學習鞏固其中所需的技術概念,以便下次能自己寫出需要的程式碼。
這是個懶辦法,雖然短期內看起來它能簡單快速地搞定問題,但從長遠上看,這個做法會嚴重影響你的成長,破壞你的創造性,並從根本上動搖你回想某些語法特性的能力(這在技術面試的時候可是致命的)。
python交流學習群:629614370多多交流問題,互幫互助,群裡有不錯的學習教程和開發工具
歐剃漢化
那我要怎麼解決呢?
為了進一步鞏固我自己對這些概念的理解,也為了幫大家節省一下每次上網搜尋的時間,我在這裡整理了一下自己使用 Python、NumPy 和 Pandas 時遇到的一些常見的小問題,希望對你有幫助。
01
只要一行程式碼的列表生成器
假如每次你想要生成個列表,都要寫個迴圈,是不是很煩呢?好在 Python 已經有一個內建方法,只要一行程式碼就能搞定這個問題。如果你不熟悉這個語法,可能理解起來會有點難度,不過一旦你習慣這個技術之後,你一定會愛不釋手的!
動圖:如何將一個迴圈改成列表生成式(來源:Trey Hunner )
上面這個動圖就是一個很好的例子,原來的程式碼就是採用 for 迴圈生成列表的方法,而圖上一步一步將它改造成了一個只有一行程式碼的列表生成式,再也不用迴圈啦。是不是很簡潔?
下面是另外一個對比範例:
使用迴圈:
輸出的結果是 [1, 4, 9, 16]
使用生成式:
輸出的結果也是 [1, 4, 9, 16]
02
Lambda 表示式
明明這個函式用不了幾次,每次都要寫一大串函式構建程式碼,是不是很累?別怕,Lambda 表示式來救你!Lambda 表示式能方便地創造簡單、一次使用而且匿名的函式物件。基本上,它們讓你無需費心構造一個函式,而是直接使用這個函式。
Lambda 表示式的基本語法是:
歐剃漢化,
要記住,Lambda 表示式創造的函式和普通的 def 構建的函式沒什麼不同,只不過函式體只有單獨一個表示式而已。看看下面這個例子:
輸出的結果是 10
03
Map 和 Filter 函式
一旦你掌握了 Lambda 表示式,將它們與 map 或 filter 函式一起使用,可謂是威力無比。
具體來說, map() 函式接收一個列表,和一個函式,它對列表裡的每個元素呼叫一個函式進行處理,再將結果放進一個新列表裡。下面這個例子中,map() 函式遍歷 seq 中的每個元素,把它乘2,再把結果放入一個新列表,最後返回這個列表。最外面一層 list() 函式是把 map() 返回的物件轉換成列表格式。
輸出的結果是 [2, 4, 6, 8, 10]
而 filter() 函式略有不同,它接收一個列表,和一個規則函式,在對列表裡的每個元素呼叫這個規則函式之後,它把所有返回值為假的元素從列表中剔除,然後返回這個過濾後的子列表。
輸出的結果是 [3, 4, 5]
04
Arange 和 Linspace 函式
為了快速方便地生成 numpy 的陣列,你一定得熟悉 arange() 和 linspace() 這兩個函式。這兩個函式分別有自己的特定用法,不過對我們來說,它們都能很好地生成 numpy 陣列(而不是用 range() ),這在資料科學的分析工作上可是相當好用的。
arange() 函式按照指定的步長返回一個等差數列。除開始和結束值之外,你還可以自定義步長和資料型別。請注意,給定的結束值引數是不會被包含在結果內的。
輸出的是一個數組物件: array([3, 5])
linspace() 函式的用法也很類似,不過有一點小小的不同。 linspace() 返回的是將給定區間進行若干等分以後的等分點組成的數列。所以你傳入的引數包括開始值、結束值,以及具體多少等分。linspace() 將這個區間進行等分後,把開始值、結束值和每個等分點都放進一個 NumPy 數組裡。這在做資料視覺化以及繪製座標軸的時候都很有用。
輸出的是一個數組物件: array([ 2.0, 2.25, 2.5, 2.75, 3.0])
05
Pandas 中座標軸(axis 引數)的意義
在 Pandas 裡要篩掉某一列,或是在 NumPy 矩陣裡要對資料求和的時候,你可能已經遇到過這個 axis 引數的問題。如果你還沒見過,那提前瞭解一下也無妨。比如,對某個 Pandas 表這樣處理:
在我真正理解之前,我基本上每次要用到 drop 的時候,都得去重新查詢一下哪個 axis 的值對應的是哪個,多到我自己都數不清了。正如上面這個示例,你大概已經看出,如果要處理列,axis 要設成 1,如果處理行,axis 要設成 0,對吧。但這是為什麼呢?我最喜歡的一個解釋(或者是我如何記住這一點的)是這樣的:
獲取 Pandas 資料表物件的 shape 屬性,你將獲得一個元組,元組的第一個元素是資料表的行數,第二個元素是資料表的列數。想想 Python 裡這兩個元素的下標吧,前面一個是 0,後面一個是 1,對不對?所以對於 axis 引數,0 就是前面的行數,1 就是後面的列數,怎麼樣,好記吧?
06
用 Concat、Merge 和 Join 來合併資料表
如果你熟悉 SQL,這幾個概念對你來說就是小菜一碟。不過不管怎樣,這幾個函式從本質上來說不過就是合併多個數據表的不同方式而已。當然,要時刻記著什麼情況下該用哪個函式也不是一件容易的事,所以,讓我們一起再回顧一下吧。
concat() 可以把一個或多個數據表按行(或列)的方向簡單堆疊起來(看你傳入的 axis 引數是 0 還是 1 咯)。
merge() 將會以使用者指定的某個名字相同的列為主鍵進行對齊,把兩個或多個數據表融合到一起。
join()和 merge() 很相似,只不過 join() 是按資料表的索引進行對齊,而不是按某一個相同的列。當某個表缺少某個索引的時候,對應的值為空(NaN)。
有需要的話,你還可以查閱Pandas 官方文件 ,瞭解更詳細的語法規則和應用例項,熟悉一些你可能會碰到的特殊情況。
07
Apply 函式
你可以把 apply() 當作是一個 map() 函式,只不過這個函式是專為 Pandas 的資料表和 series 物件打造的。對初學者來說,你可以把 series 物件想象成類似 NumPy 裡的陣列物件。它是一個一維帶索引的資料表結構。
apply() 函式作用是,將一個函式應用到某個資料表中你指定的一行或一列中的每一個元素上。是不是很方便?特別是當你需要對某一列的所有元素都進行格式化或修改的時候,你就不用再一遍遍地迴圈啦!
這裡就舉幾個簡單的例子,讓大家熟悉一下基本的語法規則:
08
資料透視表(Pivot Tables)
最後也最重要的是資料透視表。如果你對微軟的 Excel 有一定了解的話,你大概也用過(或聽過)Excel 裡的“資料透視表”功能。Pandas 裡內建的 pivot_table() 函式的功能也差不多,它能幫你對一個數據表進行格式化,並輸出一個像 Excel 工作表一樣的表格。實際使用中,透視表將根據一個或多個鍵對資料進行分組統計,將函式傳入引數 aggfunc 中,資料將會按你指定的函式進行統計,並將結果分配到表格中。
下面是幾個 pivot_table() 的應用例子:
總結
以上就是我在自學過程中經常遇到的幾個問題,及其理解方法。就我個人來說,把這些概念寫下來,並用儘可能簡單的語句描述它們,再分享給大家的整個過程,也讓我更加深入的理解和掌握這些技術。
最後,我希望,或許以後你和資料科學中這些難以捉摸的方法、函式以及概念鬥智鬥勇的時候,今天看到的一些知識能派上點用場。
學習python有任何問題(學習方法,學習效率,如何就業),可以隨時來諮詢我,這是我的python交流學習群:629614370多多交流問題,互幫互助,群裡有不錯的學習教程和開發工具。無論你是大牛還是小白,是想轉行還是想入行都可以來了解一起進步一起學習!