【我們為什麼挑選這篇文章】打 code 時遇到問題大部分的人會習慣性去查找資料,但本篇作者認為,相較於快速找到答案缺法思考過程,應學習如何用函數和概念理解每次遇到的問題;調整學習法或編程習慣,才能真正提升效率、也能幫助我們對語法更加熟知。(責任編輯:鄧天心)
如果你發覺自己在編程時一次又一次地查找相同的問題、概念或是語法,你不是一個人!
雖然我們在StackOverflow或其他網站上查找答案是很正常的事情,但這樣做確實比較花時間,也讓人懷疑你是否完全理解了這門編程語言。
我們現在生活的世界裡,似乎有著無限的免費資源,而你只需要一次搜索即可獲得。
然而,這既是這個時代的幸事,也是一種詛咒。如果沒能有效利用資源,而是對它們過度依賴,你就會養成不良的習慣,長期處於不利境地。
當我谷歌一個問題,發現有人提了同樣問題,但下面只有一個回答,而且2003年以後就再也沒有新的答案的時候,我真是和那個提問者同病相憐!弱小,可憐又無助!
就個人而言,我發現自己也是多次從類似的技術問答中找代碼;而不是花時間學習和鞏固概念,以便下次可以自己把代碼寫出來。
網上搜索答案是一種懶惰的行為,雖然在短期內它可能是最簡便的途徑,但它終究不利於你的成長,並且會降低工作效率和對語法的熟知能力。
目標
最近,我一直在Udemy學習名為Python for Data Science and Machine Learning的數據科學在線課程。在該系列課程的早期課件中,我想起了用Python做數據分析時一直被我忽略的一些概念和語法。
為了一勞永逸地鞏固我對這些概念的理解,並為大家免去一些StackOverflow的搜索,我在文章中整理了自己在使用Python,NumPy和Pandas時總是忘記的東西。
我為每個要點提供了簡短的描述和示例。為了給讀者帶來福利,我還添加了視頻和其他資源的鏈接,以便大家更深入地了解各個概念。
單行List Comprehension
每次需要定義某種列表時都要寫for循環是很乏味的,好在Python有一種內置的方法可以用一行代碼解決這個問題。該語法可能有點難以理解,但是一旦熟悉了這種技巧,你就會經常使用它。
* Line 8是對for loop的單行簡化
請參閱上圖和下文的示例,比較一下在創建列表時,你通常使用的for循環樣板和以單行代碼創建這二者之間的差別。
x = [1,2,3,4]out = []foritem in x: out.append(item**2)print(out)[1,4,9,16]# vs.x = [1,2 ,3,4]out = [item**2 foritem in x]print(out)[1,4,9,16]
Lambda 函數
編程的過程中經常為了實現最後的功能,創建一個又一個階段性的函數,這些函數往往就只用一兩次。這個過程很煩人。這時候Lambda函數來搭救你了!
Lambda函數用於在Python中創建小型的,一次性的和匿名的函數對象。
基本上,它們可以讓你「在不創建新函數的情況下」創建一個函數。
lambda函數的基本語法如下:
lambda arguments: expression
所以,只要給它一個表達式,lambda函數可以執行所有常規函數可執行的操作。請看下面的簡單示例和後文中的視頻,以更好地感受lambda函數強大的功能。
double= lambda x: x *2print(double(5))10
Map和Filter
一旦掌握了lambda函數,並學會將它們與map和filter函數配合使用,你將擁有一個強大的工具。
具體來說,map函數接受一個列表並通過對每個元素執行某種操作來將其轉換為新列表。在下面的示例中,它遍歷每個元素並將其乘以2的結果映射到新列表。請注意,這裡的list函數只是將輸出轉換為列表類型。
# Mapseq = [1,2,3,4,5]result =list(map(lambda var: var*2, seq))print(result)[2,4,6,8,10]
filter函數需要的輸入是列表和規則,非常類似於map,但它通過將每個元素與布爾過濾規則進行比較來返回原始列表的子集。
點擊觀看視頻
https://v.qq.com/x/page/v073178iyd7.html
# Filterseq = [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=)df.drop(‘Column A’, axis=1)
在我知道自己為什麼要這樣定義坐標軸之前,我不知道我寫了多少次這行代碼。你可以從上面看出,如果要處理列,就將axis設為1,如果要處理行,則將其設為0。
但為什麼會這樣呢?我記得我最喜歡的解釋是這個:
df.shape(# of Rows, # of Columns)
從Pandas的dataframe調用shape屬性時會返回一個元組,其中第一個值表示行數,第二個值表示列數。如果你想想在Python中是如何建立索引的,即行為0,列為1,會發現這與我們定義坐標軸值的方式非常相似。很有趣吧!
點擊查看視頻
https://v.qq.com/x/page/l0731dgtsn4.html
Concat, Merge, 和Join
如果你熟悉SQL,那麼這些概念對你來說可能會更容易。無論如何,這些功能基本上就是以特定方式組合dataframe的方法。可能很難評判在什麼時候使用哪個最好,所以讓我們都回顧一下。
Concat允許用戶在其下方或旁邊附加一個或多個dataframe(取決於你如何定義軸)。
Merge可以基於特定的、共有的主鍵(Primary Key)組合多個dataframe。
Join,就像merge一樣,可以組合兩個dataframe。但是,它根據它們的索引進行組合,而不是某些特定的主鍵。
大家可以查看很有幫助的Pandas文檔,了解語法和具體示例和你可能會遇到的特殊情況。
Pandas Apply
apply類似於map函數,不過它是用於Pandas DataFrames的,或者更具體地說是用於Series的。如果你不熟悉也沒關係,Series在很大程度上與NumPy中的陣列(array)非常相似。
Apply會根據你指定的內容向列或行中的每個元素發送一個函數。你可以想像這是多麼有用,特別是在對整個DataFrame的列處理格式或運算數值的時候,可以省去循環。
點擊觀看視頻
https://v.qq.com/x/page/q0731vakmj0.html
透視表
最後要說到的是透視表。如果你熟悉Microsoft Excel,那麼你可能已經聽說過數據透視表。Pandas內置的pivot_table函數將電子表格樣式的數據透視表創建為DataFrame。請注意,透視表中的維度存儲在MultiIndex對像中,用來聲明DataFrame的index和columns。
結語
我的這些Python編程小幫肘就到此為止啦。我希望我介紹的這些在使用Python做數據科學時經常遇到的重要但又有點棘手的方法、函數和概念能給你帶來幫助。
而我自己在整理這些內容並試圖用簡單的術語來闡述它們的過程中也受益良多。
——
(本文經合作夥伴 大數據文摘 授權轉載,並同意 TechOrange 編寫導讀與修訂標題,原文標題為 〈用Python做數據科學時容易忘記的八個要點!〉。)
延伸閱讀:
【百萬年薪領起來】記憶體大廠美光將大舉徵才,履歷快投起來別等年後了!
【工程師福音】在 R 上也可以運行 Python!手把手超詳盡教學
28 種 Coding 語言簡史:有人真的很不喜歡括號,於是發明了 Python