效率驚人!三大相見恨晚的Pandas函數

全文共1440字,預計學習時長6分鐘


效率驚人!三大相見恨晚的Pandas函數

圖源:unsplash


數據科學領域如此之廣,鮮少有人能精通所有語言、數據庫,筆者儘管已經從事了該行業數年之久,但仍然所知不多。學無止境,變得優秀的方法就是不停下學習的腳步。


在Pandas中,一些函數意義純粹,但也有一些函數指的是使用Pandas的方式,以及為什麼一種方法比另一種更好。這兒有一些節省大量的時間和精力Pandas函數和使用方法,這些效率驚人的神器千萬不要錯過。


效率驚人!三大相見恨晚的Pandas函數

itertuples()


確實,它並不是純粹的函數,而是指使用Pandas的更有效方法,是循環訪問數據集的快捷方法。在花時間理解註釋部分之前,可以用更有效的方法計算總列值,在此筆者僅提出一些要點。


下面是一列簡單數據集,數字範圍為1到1百萬。


<code>df =pd.DataFrame(data={
   'Number': range(1, 1000000)
})/<code>


這是前幾行的示例:

效率驚人!三大相見恨晚的Pandas函數

現在列舉一個錯誤的方式。輸入一個總計變量並將其設置為0. 然後,通過使用iterrows()循環訪問數據集,並在total的基礎上增加當前行的值,與此同時統計操作時間。以下是代碼:


<code>%%timetotal= 0for _, row in df.iterrows():
    total += row['Number']
 
total>>> Wall time: 18.7 s/<code>


這項小小的操作歷時將近19秒,而現在有一個更快捷的方法,與上述操作大致相同,但要加iteruples 而不是 iterrows:


<code>%%timetotal= 0for row in df.itertuples(index=False):
    total += row.Number
 
total>>> Wall time: 82.1 ms/<code>


筆者沒有計算時間,但可以看到操作速度提高非常明顯。下次執行循環時請記住這一點。


效率驚人!三大相見恨晚的Pandas函數

nlargest()和nsmallest()


筆者計算了兩個緯度/經度對之間的距離(以公里為單位)。那是第一步操作,第二步是選擇距離最小的前N條記錄。


效率驚人!三大相見恨晚的Pandas函數

圖源:unsplash


輸入-nsmallest()。nlargest()將返回N個最大值,而nsmallest()將恰好相反。


看看它的實際結果。在實際操作中,筆者準備了一個小的數據集:


<code>df =pd.DataFrame(data={
    'Name': ['Bob', 'Mark', 'Josh','Anna', 'Peter', 'Dexter'],
    'Points': [37, 91, 66, 42, 99, 81]
})/<code>


結果如下:


效率驚人!三大相見恨晚的Pandas函數

現在該數據集不是僅僅6行,而是包含了6000行,為了找到表現最好的學生,即分數最高,一種方法是這樣的:


<code>df['Points'].nlargest(3)/<code>


但這不是最佳解決方案,它會導致以下結果,沒有清楚顯示真實姓名:


改善方法如下:


<code>df.nlargest(3,columns='Points')/<code>


怎麼樣,是不是看起來更棒了:


效率驚人!三大相見恨晚的Pandas函數

以幾乎相同的操作來找到3個表現最差的學生-使用nsmallest()功能:


<code>df.nsmallest(3,columns='Points')/<code>


輸出結果如下:

效率驚人!三大相見恨晚的Pandas函數

效率驚人!三大相見恨晚的Pandas函數

cut()


這一部分將繼續使用上一部分中的數據集,來回顧一下:


<code>df =pd.DataFrame(data={
    'Name': ['Bob', 'Mark', 'Josh','Anna', 'Peter', 'Dexter'],
    'Points': [37, 91, 66, 42, 99, 81]
})/<code>


效率驚人!三大相見恨晚的Pandas函數

cut()函數的基本原理是將值分為不同的區間。下面是最簡單的示例,將從Points屬性創建兩個容器:


<code>pd.cut(df['Points'],bins=2)/<code>


效率驚人!三大相見恨晚的Pandas函數

現在還看不出效果。但是如何輸入從0到50的區間,以及第二個從50到100的區間呢?聽起來有點麻煩。以下為代碼:


<code>pd.cut(df['Points'],bins=[0, 50, 100])/<code>


效率驚人!三大相見恨晚的Pandas函數

但是需要注意的是,您要顯示的是Fail而不是(0,50],要顯示Pass而不是(50,100]。你需要這樣做:


<code>pd.cut(df['Points'],bins=[0, 50, 100], labels=['Fail', 'Pass'])/<code>


效率驚人!三大相見恨晚的Pandas函數

對於剛入門的程序員,這些功能將有助於節省時間和精力;如果你是資深程序員,本文或許能幫你加強對這些函數的瞭解,避免每次都得從頭開始捋,因為這樣毫無意義。


效率驚人!三大相見恨晚的Pandas函數

留言點贊關注

我們一起分享AI學習與發展的乾貨

如轉載,請後臺留言,遵守轉載規範


分享到:


相關文章: