用Python做數(shù)據(jù)科學(xué)時(shí)容易忘記的八個(gè)要點(diǎn)!
如果你發(fā)覺自己在編程時(shí)一次又一次地查找相同的問題、概念或是語(yǔ)法,你不是一個(gè)人!
雖然我們?cè)赟tackOverflow或其他網(wǎng)站上查找答案是很正常的事情,但這樣做確實(shí)比較花時(shí)間,也讓人懷疑你是否完全理解了這門編程語(yǔ)言。
我們現(xiàn)在生活的世界里,似乎有著***的免費(fèi)資源,而你只需要一次搜索即可獲得。然而,這既是這個(gè)時(shí)代的幸事,也是一種詛咒。如果沒能有效利用資源,而是對(duì)它們過度依賴,你就會(huì)養(yǎng)成不良的習(xí)慣,長(zhǎng)期處于不利境地。
當(dāng)我谷歌一個(gè)問題,發(fā)現(xiàn)有人提了同樣問題,但下面只有一個(gè)回答,而且2003年以后就再也沒有新的答案的時(shí)候,我真是和那個(gè)提問者同病相憐!弱小,可憐又無(wú)助!
“你是誰(shuí)!你在哪兒!***你發(fā)現(xiàn)了啥!”
就個(gè)人而言,我發(fā)現(xiàn)自己也是多次從類似的技術(shù)問答中找代碼(見上文插圖漫畫);而不是花時(shí)間學(xué)習(xí)和鞏固概念,以便下次可以自己把代碼寫出來(lái)。
網(wǎng)上搜索答案是一種懶惰的行為,雖然在短期內(nèi)它可能是最簡(jiǎn)便的途徑,但它終究不利于你的成長(zhǎng),并且會(huì)降低工作效率和對(duì)語(yǔ)法的熟知能力(咳咳,面試的時(shí)候這些知識(shí)很重要)。
目標(biāo)
最近,我一直在Udemy學(xué)習(xí)名為Python for Data Science and Machine Learning的數(shù)據(jù)科學(xué)在線課程。在該系列課程的早期課件中,我想起了用Python做數(shù)據(jù)分析時(shí)一直被我忽略的一些概念和語(yǔ)法。
為了一勞永逸地鞏固我對(duì)這些概念的理解,并為大家免去一些StackOverflow的搜索,我在文章中整理了自己在使用Python,NumPy和Pandas時(shí)總是忘記的東西。
我為每個(gè)要點(diǎn)提供了簡(jiǎn)短的描述和示例。為了給讀者帶來(lái)福利,我還添加了視頻和其他資源的鏈接,以便大家更深入地了解各個(gè)概念。
單行List Comprehension
每次需要定義某種列表時(shí)都要寫for循環(huán)是很乏味的,好在Python有一種內(nèi)置的方法可以用一行代碼解決這個(gè)問題。該語(yǔ)法可能有點(diǎn)難以理解,但是一旦熟悉了這種技巧,你就會(huì)經(jīng)常使用它。
* Line 8是對(duì)for loop的單行簡(jiǎn)化
請(qǐng)參閱上圖和下文的示例,比較一下在創(chuàng)建列表時(shí),你通常使用的for循環(huán)樣板和以單行代碼創(chuàng)建這二者之間的差別。
- 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 函數(shù)
編程的過程中經(jīng)常為了實(shí)現(xiàn)***的功能,創(chuàng)建一個(gè)又一個(gè)階段性的函數(shù),這些函數(shù)往往就只用一兩次。這個(gè)過程很煩人。這時(shí)候Lambda函數(shù)來(lái)搭救你了!
Lambda函數(shù)用于在Python中創(chuàng)建小型的,一次性的和匿名的函數(shù)對(duì)象?;旧?,它們可以讓你“在不創(chuàng)建新函數(shù)的情況下”創(chuàng)建一個(gè)函數(shù)。
lambda函數(shù)的基本語(yǔ)法如下:
- lambda arguments: expression
所以,只要給它一個(gè)表達(dá)式,lambda函數(shù)可以執(zhí)行所有常規(guī)函數(shù)可執(zhí)行的操作。請(qǐng)看下面的簡(jiǎn)單示例和后文中的視頻,以更好地感受lambda函數(shù)強(qiáng)大的功能。
- double = lambda x: x * 2
- print(double(5))
- 10
Map和Filter
一旦掌握了lambda函數(shù),并學(xué)會(huì)將它們與map和filter函數(shù)配合使用,你將擁有一個(gè)強(qiáng)大的工具。
具體來(lái)說(shuō),map函數(shù)接受一個(gè)列表并通過對(duì)每個(gè)元素執(zhí)行某種操作來(lái)將其轉(zhuǎn)換為新列表。在下面的示例中,它遍歷每個(gè)元素并將其乘以2的結(jié)果映射到新列表。請(qǐng)注意,這里的list函數(shù)只是將輸出轉(zhuǎn)換為列表類型。
- # Map
- seq = [1, 2, 3, 4, 5]
- result = list(map(lambda var: var*2, seq))
- print(result)
- [2, 4, 6, 8, 10]
filter函數(shù)需要的輸入是列表和規(guī)則,非常類似于map,但它通過將每個(gè)元素與布爾過濾規(guī)則進(jìn)行比較來(lái)返回原始列表的子集。
- # Filter
- seq = [1, 2, 3, 4, 5]
- result = list(filter(lambda x: x > 2, seq))
- print(result)
- [3, 4, 5]
Arange和Linspace
要?jiǎng)?chuàng)建快速簡(jiǎn)單的NumPy數(shù)組,可以查看arange和linspace函數(shù)。它們都有特定的用途,但在這里我們看中的是它們都輸出Numpy數(shù)組(而非其使用范圍),這通常更容易用于數(shù)據(jù)科學(xué)。
Arange在給定的范圍內(nèi)返回間隔均勻的值。除了起始值和終止值,你還可以根據(jù)需要定義步長(zhǎng)或數(shù)據(jù)類型。請(qǐng)注意,終止值是一個(gè)“截止”值,因此它不會(huì)被包含在數(shù)組輸出中。
- # np.arange(start, stop, step)
- np.arange(3, 7, 2)
- array([3, 5])
Linspace與Arange非常相似,但略有不同。Linspace是在指定的范圍內(nèi)返回指定個(gè)數(shù)的間隔均勻的數(shù)字。所以給定一個(gè)起始值和終止值,并指定返回值的個(gè)數(shù),linspace將根據(jù)你指定的個(gè)數(shù)在NumPy數(shù)組中劃好等分。這對(duì)于數(shù)據(jù)可視化和在定義圖表坐標(biāo)軸時(shí)特別有用。
- # 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矩陣中對(duì)值進(jìn)行求和時(shí),可能會(huì)遇到這問題。即使沒有,那么你也肯定會(huì)在將來(lái)的某個(gè)時(shí)候碰到。我們現(xiàn)在來(lái)看看刪除列的示例:
- df.drop('Row A', axis=0)
- df.drop('Column A', axis=1)
在我知道自己為什么要這樣定義坐標(biāo)軸之前,我不知道我寫了多少次這行代碼。你可以從上面看出,如果要處理列,就將axis設(shè)為1,如果要處理行,則將其設(shè)為0。
但為什么會(huì)這樣呢?我記得我最喜歡的解釋是這個(gè):
- df.shape
- (# of Rows, # of Columns)
從Pandas的dataframe調(diào)用shape屬性時(shí)會(huì)返回一個(gè)元組,其中***個(gè)值表示行數(shù),第二個(gè)值表示列數(shù)。如果你想想在Python中是如何建立索引的,即行為0,列為1,會(huì)發(fā)現(xiàn)這與我們定義坐標(biāo)軸值的方式非常相似。很有趣吧!
Concat, Merge, 和Join
如果你熟悉SQL,那么這些概念對(duì)你來(lái)說(shuō)可能會(huì)更容易。無(wú)論如何,這些功能基本上就是以特定方式組合dataframe的方法??赡芎茈y評(píng)判在什么時(shí)候使用哪個(gè)***,所以讓我們都回顧一下。
Concat允許用戶在其下方或旁邊附加一個(gè)或多個(gè)dataframe(取決于你如何定義軸)。
Merge可以基于特定的、共有的主鍵(Primary Key)組合多個(gè)dataframe。
Join,就像merge一樣,可以組合兩個(gè)dataframe。但是,它根據(jù)它們的索引進(jìn)行組合,而不是某些特定的主鍵。
大家可以查看很有幫助的Pandas文檔,了解語(yǔ)法和具體示例和你可能會(huì)遇到的特殊情況。
Pandas Apply
apply類似于map函數(shù),不過它是用于Pandas DataFrames的,或者更具體地說(shuō)是用于Series的。如果你不熟悉也沒關(guān)系,Series在很大程度上與NumPy中的陣列(array)非常相似。
Apply會(huì)根據(jù)你指定的內(nèi)容向列或行中的每個(gè)元素發(fā)送一個(gè)函數(shù)。你可以想象這是多么有用,特別是在對(duì)整個(gè)DataFrame的列處理格式或運(yùn)算數(shù)值的時(shí)候,可以省去循環(huán)。
透視表
***要說(shuō)到的是透視表。如果你熟悉Microsoft Excel,那么你可能已經(jīng)聽說(shuō)過數(shù)據(jù)透視表。Pandas內(nèi)置的pivot_table函數(shù)將電子表格樣式的數(shù)據(jù)透視表創(chuàng)建為DataFrame。請(qǐng)注意,透視表中的維度存儲(chǔ)在MultiIndex對(duì)象中,用來(lái)聲明DataFrame的index和columns。
結(jié)語(yǔ)
我的這些Python編程小貼士就到此為止啦。我希望我介紹的這些在使用Python做數(shù)據(jù)科學(xué)時(shí)經(jīng)常遇到的重要但又有點(diǎn)棘手的方法、函數(shù)和概念能給你帶來(lái)幫助。
而我自己在整理這些內(nèi)容并試圖用簡(jiǎn)單的術(shù)語(yǔ)來(lái)闡述它們的過程中也受益良多。
相關(guān)報(bào)道:
https://towardsdatascience.com/python-for-data-science-8-concepts-you-may-have-forgotten-i-did-825966908393
【本文是51CTO專欄機(jī)構(gòu)大數(shù)據(jù)文摘的原創(chuàng)譯文,微信公眾號(hào)“大數(shù)據(jù)文摘( id: BigDataDigest)”】