自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

數(shù)據(jù)處理必看:如何讓你的Pandas循環(huán)加快71803倍

大數(shù)據(jù)
如果你使用 python 和 pandas 進(jìn)行數(shù)據(jù)分析,那么不久你就會(huì)第一次使用循環(huán)了。然而,即使是對(duì)小型數(shù)據(jù)集,使用標(biāo)準(zhǔn)循環(huán)也很費(fèi)時(shí),你很快就會(huì)意識(shí)到大型數(shù)據(jù)幀可能需要很長(zhǎng)的時(shí)間。當(dāng)我第一次等了半個(gè)多小時(shí)來(lái)執(zhí)行代碼時(shí),我找到了接下來(lái)想與你共享的替代方案。

數(shù)據(jù)處理必看:如何讓你的Pandas循環(huán)加快71803倍

雷鋒網(wǎng) AI 開(kāi)發(fā)者按,如果你使用 python 和 pandas 進(jìn)行數(shù)據(jù)分析,那么不久你就會(huì)第一次使用循環(huán)了。然而,即使是對(duì)小型數(shù)據(jù)集,使用標(biāo)準(zhǔn)循環(huán)也很費(fèi)時(shí),你很快就會(huì)意識(shí)到大型數(shù)據(jù)幀可能需要很長(zhǎng)的時(shí)間。當(dāng)我第一次等了半個(gè)多小時(shí)來(lái)執(zhí)行代碼時(shí),我找到了接下來(lái)想與你共享的替代方案。

標(biāo)準(zhǔn)循環(huán)

數(shù)據(jù)幀是具有行和列的 pandas 對(duì)象。如果使用循環(huán),則將遍歷整個(gè)對(duì)象。python 不能用任何內(nèi)置函數(shù),而且速度非常慢。在我們的示例中,我們得到了一個(gè)具有 65 列和 1140 行的數(shù)據(jù)幀,它包含 2016-2019 賽季的足球比賽結(jié)果。我們要?jiǎng)?chuàng)建一個(gè)新的列來(lái)指示某個(gè)特定的隊(duì)是否打過(guò)平局。我們可以這樣開(kāi)始:

 

  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,):    

 

數(shù)據(jù)處理必看:如何讓你的Pandas循環(huán)加快71803倍

因?yàn)槲覀兊臄?shù)據(jù)框架中包含了英超的每一場(chǎng)比賽,所以我們必須檢查我們感興趣的球隊(duì)(阿森納)是否參加過(guò)比賽,是否適用,他們是主隊(duì)還是客隊(duì)。如你所見(jiàn),這個(gè)循環(huán)非常慢,需要 207 秒才能執(zhí)行。讓我們看看如何提高效率。

pandas 內(nèi)置函數(shù):iterrow()——快 321 倍

在第一個(gè)示例中,我們循環(huán)訪問(wèn)了整個(gè)數(shù)據(jù)幀。iterrows()為每行返回一個(gè)序列,因此它以一對(duì)索引的形式在數(shù)據(jù)幀上迭代,而感興趣的列以序列的形式迭代。這使得它比標(biāo)準(zhǔn)循環(huán)更快:

 

  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 

 

數(shù)據(jù)處理必看:如何讓你的Pandas循環(huán)加快71803倍

代碼運(yùn)行需要 68 毫秒,比標(biāo)準(zhǔn)循環(huán)快 321 倍。但是,許多人建議不要使用它,因?yàn)槿匀挥懈斓姆椒?,并?iterrows() 不保留跨行的數(shù)據(jù)類型。這意味著,如果在數(shù)據(jù)幀上使用 iterrow(),則可以更改數(shù)據(jù)類型,這會(huì)導(dǎo)致很多問(wèn)題。要保留數(shù)據(jù)類型,還可以使用 itertuples()。我們不會(huì)在這里詳細(xì)討論,因?yàn)槲覀円P(guān)注效率。你可以在這里找到官方文件:

數(shù)據(jù)處理必看:如何讓你的Pandas循環(huán)加快71803倍

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

apply()方法——快 811 倍

apply 本身并不快,但與數(shù)據(jù)幀結(jié)合使用時(shí)具有優(yōu)勢(shì)。這取決于應(yīng)用表達(dá)式的內(nèi)容。如果可以在 Cython 空間中執(zhí)行,則速度會(huì)更快(在這里就是這種情況)。

我們可以將 apply 與 Lambda 函數(shù)一起使用。我們要做的就是指定軸。在這種情況下,我們必須使用 axis=1,因?yàn)槲覀円獔?zhí)行一個(gè)列操作:

數(shù)據(jù)處理必看:如何讓你的Pandas循環(huán)加快71803倍

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

pandas 矢量化——快 9280 倍

現(xiàn)在我們可以討論一個(gè)新話題了。我們利用矢量化的優(yōu)點(diǎn)來(lái)創(chuàng)建真正快速的代碼。重點(diǎn)是避免像前面的例子 [1] 中那樣的 Python 級(jí)循環(huán),并使用優(yōu)化的 C 代碼,這個(gè)代碼使用內(nèi)存的效率更高。我們只需要稍微修改函數(shù):

 

  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):     

現(xiàn)在我們可以用 pandas series 作為輸入創(chuàng)建新列:

數(shù)據(jù)處理必看:如何讓你的Pandas循環(huán)加快71803倍

在這種情況下,我們甚至不需要循環(huán)。我們要做的就是調(diào)整函數(shù)的內(nèi)容?,F(xiàn)在我們可以直接將 pandas series 傳遞給我們的函數(shù),這會(huì)導(dǎo)致巨大的速度增益。

Numpy 矢量化——速度快 71.803 倍

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

數(shù)據(jù)處理必看:如何讓你的Pandas循環(huán)加快71803倍

Numpy 數(shù)組非??欤覀兊拇a運(yùn)行時(shí)間為 0305 毫秒,比開(kāi)始使用的標(biāo)準(zhǔn)循環(huán)快 71803 倍。

結(jié)論

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

數(shù)據(jù)處理必看:如何讓你的Pandas循環(huán)加快71803倍

如果你從這篇文章中選擇兩條規(guī)則,我會(huì)很高興:

  • 如果確定需要使用循環(huán),則應(yīng)始終選擇 apply 方法
  • 否則,矢量化總是更好的,因?yàn)樗?/li>

本文轉(zhuǎn)自雷鋒網(wǎng),如需轉(zhuǎn)載請(qǐng)至雷鋒網(wǎng)官網(wǎng)申請(qǐng)授權(quán)。

責(zé)任編輯:未麗燕 來(lái)源: 雷鋒網(wǎng)
相關(guān)推薦

2020-06-24 11:59:31

PythonPandas數(shù)據(jù)處理

2019-06-26 08:37:23

Python數(shù)據(jù)處理編程語(yǔ)言

2023-08-30 09:16:38

PandasPython

2020-02-28 09:26:54

PythonGo語(yǔ)言C語(yǔ)言

2023-12-12 11:06:37

PythonPandas數(shù)據(jù)

2024-05-08 14:05:03

時(shí)間序列數(shù)據(jù)

2021-02-17 13:20:51

forpandas語(yǔ)言

2022-11-17 11:52:35

pandasPySpark大數(shù)據(jù)

2023-03-24 16:41:36

Pandas技巧數(shù)據(jù)處理

2023-12-18 10:36:46

數(shù)據(jù)處理PandasPython

2023-09-25 13:19:41

pandasPython

2019-06-12 16:21:52

時(shí)間序列PythonPandas

2024-10-24 17:03:19

AWK數(shù)據(jù)處理

2021-08-12 08:00:00

Pandas數(shù)據(jù)分析SQL

2021-09-08 08:00:00

PyPolars數(shù)據(jù)開(kāi)源

2020-07-21 15:40:55

NginxJava服務(wù)器

2018-07-27 09:32:18

Python代碼數(shù)據(jù)

2011-07-13 08:56:52

服務(wù)器大數(shù)據(jù)

2022-07-07 10:46:51

數(shù)據(jù)處理

2024-06-25 15:35:53

LangChain轉(zhuǎn)換鏈
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)