成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

數據處理必看:如何讓你的Pandas循環加快71803倍

大數據
如果你使用 python 和 pandas 進行數據分析,那么不久你就會第一次使用循環了。然而,即使是對小型數據集,使用標準循環也很費時,你很快就會意識到大型數據幀可能需要很長的時間。當我第一次等了半個多小時來執行代碼時,我找到了接下來想與你共享的替代方案。

數據處理必看:如何讓你的Pandas循環加快71803倍

雷鋒網 AI 開發者按,如果你使用 python 和 pandas 進行數據分析,那么不久你就會第一次使用循環了。然而,即使是對小型數據集,使用標準循環也很費時,你很快就會意識到大型數據幀可能需要很長的時間。當我第一次等了半個多小時來執行代碼時,我找到了接下來想與你共享的替代方案。

標準循環

數據幀是具有行和列的 pandas 對象。如果使用循環,則將遍歷整個對象。python 不能用任何內置函數,而且速度非常慢。在我們的示例中,我們得到了一個具有 65 列和 1140 行的數據幀,它包含 2016-2019 賽季的足球比賽結果。我們要創建一個新的列來指示某個特定的隊是否打過平局。我們可以這樣開始:

 

  1. leaguedf['Draws'] = 99999    
  2.  
  3. for row in range(0, len(leaguedf)):     
  4.  
  5. if ((leaguedf['HomeTeam'].iloc[row] == TEAM) & (leaguedf['FTR'].iloc[row] == 'D')) | \ 
  6. ((leaguedf['AwayTeam'].iloc[row] == TEAM) & (leaguedf['FTR'].iloc[row] == 'D')):     
  7.  
  8. leaguedf['Draws'].iloc[row] = 'Draw'      
  9. elif ((leaguedf['HomeTeam'].iloc[row] == TEAM) & (leaguedf['FTR'].iloc[row] != 'D')) | \
  10.  
  11. ((leaguedf['AwayTeam'].iloc[row] == TEAM) & (leaguedf['FTR'].iloc[row] != 'D')):   
  12. leaguedf['Draws'].iloc[row] = 'No_Draw'  
  13.  
  14. else:      
  15.  
  16. leaguedf['Draws'].iloc[row] = 'No_Game'  
  17. def soc_loop(leaguedf,TEAM,):    

 

數據處理必看:如何讓你的Pandas循環加快71803倍

因為我們的數據框架中包含了英超的每一場比賽,所以我們必須檢查我們感興趣的球隊(阿森納)是否參加過比賽,是否適用,他們是主隊還是客隊。如你所見,這個循環非常慢,需要 207 秒才能執行。讓我們看看如何提高效率。

pandas 內置函數:iterrow()——快 321 倍

在第一個示例中,我們循環訪問了整個數據幀。iterrows()為每行返回一個序列,因此它以一對索引的形式在數據幀上迭代,而感興趣的列以序列的形式迭代。這使得它比標準循環更快:

 

  1. def soc_iter(TEAM,home,away,ftr):  
  2.         #team, row['HomeTeam'], row['AwayTeam'], row['FTR']    
  3.         if [((home == TEAM) & (ftr == 'D')) | ((away == TEAM) & (ftr == 'D'))]:     
  4.                 result = 'Draw'     
  5.        elif [((home == TEAM) & (ftr != 'D')) | ((away == TEAM) & (ftr != 'D'))]:     
  6.               result = 'No_Draw'  
  7.  
  8.        else:     
  9.               result = 'No_Game'    
  10.        return result 

 

數據處理必看:如何讓你的Pandas循環加快71803倍

代碼運行需要 68 毫秒,比標準循環快 321 倍。但是,許多人建議不要使用它,因為仍然有更快的方法,并且 iterrows() 不保留跨行的數據類型。這意味著,如果在數據幀上使用 iterrow(),則可以更改數據類型,這會導致很多問題。要保留數據類型,還可以使用 itertuples()。我們不會在這里詳細討論,因為我們要關注效率。你可以在這里找到官方文件:

數據處理必看:如何讓你的Pandas循環加快71803倍

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.itertuples.html?source=post_page-----805030df4f06----------------------

apply()方法——快 811 倍

apply 本身并不快,但與數據幀結合使用時具有優勢。這取決于應用表達式的內容。如果可以在 Cython 空間中執行,則速度會更快(在這里就是這種情況)。

我們可以將 apply 與 Lambda 函數一起使用。我們要做的就是指定軸。在這種情況下,我們必須使用 axis=1,因為我們要執行一個列操作:

數據處理必看:如何讓你的Pandas循環加快71803倍

此代碼甚至比以前的方法更快,只需要 27 毫秒就能完成。

pandas 矢量化——快 9280 倍

現在我們可以討論一個新話題了。我們利用矢量化的優點來創建真正快速的代碼。重點是避免像前面的例子 [1] 中那樣的 Python 級循環,并使用優化的 C 代碼,這個代碼使用內存的效率更高。我們只需要稍微修改函數:

 

  1. df['Draws'] = 'No_Game'     
  2.         df.loc[((home == TEAM) & (ftr == 'D')) | ((away == TEAM) & (ftr == 'D')), 'Draws'] = 'Draw'
  3.        df.loc[((home == TEAM) & (ftr != 'D')) | ((away == TEAM) & (ftr != 'D')), 'Draws'] = 'No_Draw'  
  4.        def soc_iter(TEAM,home,away,ftr):     

現在我們可以用 pandas series 作為輸入創建新列:

數據處理必看:如何讓你的Pandas循環加快71803倍

在這種情況下,我們甚至不需要循環。我們要做的就是調整函數的內容?,F在我們可以直接將 pandas series 傳遞給我們的函數,這會導致巨大的速度增益。

Numpy 矢量化——速度快 71.803 倍

在前面的示例中,我們將 pandas series 傳遞給了函數。通過添加.values,我們收到一個 Numpy 數組:

數據處理必看:如何讓你的Pandas循環加快71803倍

Numpy 數組非??欤覀兊拇a運行時間為 0305 毫秒,比開始使用的標準循環快 71803 倍。

結論

如果您使用 python、pandas 和 Numpy 進行數據分析,那么代碼總會有一些改進空間。我們比較了五種不同的方法,在計算的基礎上增加了一個新的列到我們的數據框架中。我們注意到在速度方面存在巨大差異:

數據處理必看:如何讓你的Pandas循環加快71803倍

如果你從這篇文章中選擇兩條規則,我會很高興:

  • 如果確定需要使用循環,則應始終選擇 apply 方法
  • 否則,矢量化總是更好的,因為它更快

本文轉自雷鋒網,如需轉載請至雷鋒網官網申請授權。

責任編輯:未麗燕 來源: 雷鋒網
相關推薦

2019-06-26 08:37:23

Python數據處理編程語言

2023-08-30 09:16:38

PandasPython

2020-06-24 11:59:31

PythonPandas數據處理

2020-02-28 09:26:54

PythonGo語言C語言

2023-12-12 11:06:37

PythonPandas數據

2021-02-17 13:20:51

forpandas語言

2022-11-17 11:52:35

pandasPySpark大數據

2024-05-08 14:05:03

時間序列數據

2023-03-24 16:41:36

Pandas技巧數據處理

2023-12-18 10:36:46

數據處理PandasPython

2020-07-21 15:40:55

NginxJava服務器

2023-09-25 13:19:41

pandasPython

2019-06-12 16:21:52

時間序列PythonPandas

2021-08-12 08:00:00

Pandas數據分析SQL

2022-10-27 07:09:34

DjangoAPIRedis

2021-09-08 08:00:00

PyPolars數據開源

2024-10-24 17:03:19

AWK數據處理

2018-07-27 09:32:18

Python代碼數據

2011-07-13 08:56:52

服務器大數據

2015-05-05 11:18:18

大數據Hadoop技術處理
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区二区三区在线 | 国产精品综合色区在线观看 | 久久久久亚洲国产| 在线视频中文字幕 | 亚洲欧洲综合av | 久久久久久亚洲精品不卡 | 国产精品欧美一区二区三区不卡 | 成人一区二区三区 | 日日操夜夜操天天操 | 免费国产精品久久久久久 | 99久久99久久精品国产片果冰 | 中国一级特黄真人毛片免费观看 | 国产精品99久久久久久动医院 | 中文字幕91 | 美女福利视频一区 | 黄色网址在线免费观看 | www.成人在线视频 | av大片 | 97国产精品| 久久久国产精品网站 | 日本手机看片 | 黄色大片观看 | 国产美女视频黄a视频免费 国产精品福利视频 | 在线日韩中文字幕 | 日韩av在线一区二区 | 日韩欧美国产电影 | 日韩成人免费视频 | 日韩中文字幕免费 | 成人久久18免费网站麻豆 | 国产网站在线免费观看 | 日韩中文字幕在线 | 精品国产乱码久久久久久牛牛 | 综合国产 | 日本一道本 | 亚洲一区二区三区在线免费观看 | 成人免费高清 | 一区二区三区在线 | 国产精品一区在线 | 在线视频91 | av日韩一区| 玖玖国产 |