全文共1440字,預計學習時長6分鐘
數據科學領域如此之廣,鮮少有人能精通所有語言、數據庫,筆者儘管已經從事了該行業數年之久,但仍然所知不多。學無止境,變得優秀的方法就是不停下學習的腳步。
在Pandas中,一些函數意義純粹,但也有一些函數指的是使用Pandas的方式,以及為什麼一種方法比另一種更好。這兒有一些節省大量的時間和精力Pandas函數和使用方法,這些效率驚人的神器千萬不要錯過。
itertuples()
確實,它並不是純粹的函數,而是指使用Pandas的更有效方法,是循環訪問數據集的快捷方法。在花時間理解註釋部分之前,可以用更有效的方法計算總列值,在此筆者僅提出一些要點。
下面是一列簡單數據集,數字範圍為1到1百萬。
<code>df =pd.DataFrame(data={ 'Number': range(1, 1000000) })/<code>
這是前幾行的示例:
現在列舉一個錯誤的方式。輸入一個總計變量並將其設置為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>
筆者沒有計算時間,但可以看到操作速度提高非常明顯。下次執行循環時請記住這一點。
nlargest()和nsmallest()
筆者計算了兩個緯度/經度對之間的距離(以公里為單位)。那是第一步操作,第二步是選擇距離最小的前N條記錄。
輸入-nsmallest()。nlargest()將返回N個最大值,而nsmallest()將恰好相反。
看看它的實際結果。在實際操作中,筆者準備了一個小的數據集:
<code>df =pd.DataFrame(data={ 'Name': ['Bob', 'Mark', 'Josh','Anna', 'Peter', 'Dexter'], 'Points': [37, 91, 66, 42, 99, 81] })/<code>
結果如下:
現在該數據集不是僅僅6行,而是包含了6000行,為了找到表現最好的學生,即分數最高,一種方法是這樣的:
<code>df['Points'].nlargest(3)/<code>
但這不是最佳解決方案,它會導致以下結果,沒有清楚顯示真實姓名:
改善方法如下:
<code>df.nlargest(3,columns='Points')/<code>
怎麼樣,是不是看起來更棒了:
以幾乎相同的操作來找到3個表現最差的學生-使用nsmallest()功能:
<code>df.nsmallest(3,columns='Points')/<code>
輸出結果如下:
cut()
這一部分將繼續使用上一部分中的數據集,來回顧一下:
<code>df =pd.DataFrame(data={ 'Name': ['Bob', 'Mark', 'Josh','Anna', 'Peter', 'Dexter'], 'Points': [37, 91, 66, 42, 99, 81] })/<code>
cut()函數的基本原理是將值分為不同的區間。下面是最簡單的示例,將從Points屬性創建兩個容器:
<code>pd.cut(df['Points'],bins=2)/<code>
現在還看不出效果。但是如何輸入從0到50的區間,以及第二個從50到100的區間呢?聽起來有點麻煩。以下為代碼:
<code>pd.cut(df['Points'],bins=[0, 50, 100])/<code>
但是需要注意的是,您要顯示的是Fail而不是(0,50],要顯示Pass而不是(50,100]。你需要這樣做:
<code>pd.cut(df['Points'],bins=[0, 50, 100], labels=['Fail', 'Pass'])/<code>
對於剛入門的程序員,這些功能將有助於節省時間和精力;如果你是資深程序員,本文或許能幫你加強對這些函數的瞭解,避免每次都得從頭開始捋,因為這樣毫無意義。
留言點贊關注
我們一起分享AI學習與發展的乾貨
如轉載,請後臺留言,遵守轉載規範