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

Pandas循環提速7萬多倍!Python數據分析哪種更快?

新聞 大數據
用Python和Pandas進行數據分析,很快就會用到循環。但在這其中,就算是較小的DataFrame,使用標準循環也比較耗時。

本文經AI新媒體量子位(公眾號ID:QbitAI)授權轉載,轉載請聯系出處。

用Python和Pandas進行數據分析,很快就會用到循環。

但在這其中,就算是較小的DataFrame,使用標準循環也比較耗時。

遇到較大的DataFrame時,需要的時間會更長,會讓人更加頭疼。

現在,有人忍不了了。他是一位來自德國的數據分析師,名叫Benedikt Droste。

他說,當自己花了大半個小時等待代碼執行的時候,決定尋找速度更快的替代方案。

在給出的替代方案中,使用Numpy向量化,與使用標準循環相比,速度提升了71803倍。

Pandas循環提速7萬多倍!Python數據分析攻略

他是怎么實現的?我們一起來看看~

標準循環處理3年足球賽數據:20.7秒

DataFrame是具有行和列的Pandas對象。如果使用循環,需要遍歷整個對象。

Python不能利用任何內置函數,而且速度很慢。在Benedikt Droste的提供的示例中,是一個包含65列和1140行的Dataframe,包含了2016-2019賽季的足球賽結果。

需要解決的問題是:創建一個新的列,用于指示某個特定的隊是否打了平局。可以這樣開始:

  1. def soc_loop(leaguedf,TEAM,): 
  2.  leaguedf['Draws'] = 99999 
  3.  for row in range(0, len(leaguedf)): 
  4.  if ((leaguedf['HomeTeam'].iloc[row] == TEAM) & (leaguedf['FTR'].iloc[row] == 'D')) | \ 
  5.  ((leaguedf['AwayTeam'].iloc[row] == TEAM) & (leaguedf['FTR'].iloc[row] == 'D')): 
  6.  leaguedf['Draws'].iloc[row] = 'Draw' 
  7.  elif ((leaguedf['HomeTeam'].iloc[row] == TEAM) & (leaguedf['FTR'].iloc[row] != 'D')) | \ 
  8.  ((leaguedf['AwayTeam'].iloc[row] == TEAM) & (leaguedf['FTR'].iloc[row] != 'D')): 
  9.  leaguedf['Draws'].iloc[row] = 'No_Draw' 
  10.  else
  11.  leaguedf['Draws'].iloc[row] = 'No_Game' 
Pandas循環提速7萬多倍!Python數據分析攻略

在這個案例中是阿森納,在實現目標之前要確認阿森納參加了哪些場比賽,是主隊還是客隊。但使用標準循環非常慢,執行時間為20.7秒。

那么,怎么才能更有效率?

Pandas 內置函數: iterrows ()ー快321倍

在第一個示例中,循環遍歷了整個DataFrame。iterrows()為每一行返回一個Series,它以索引對的形式遍歷DataFrame,以Series的形式遍歷感興趣的列。這使得它比標準循環更快:

  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.  else
  8.  result = 'No_Game' 
  9.  return result 
Pandas循環提速7萬多倍!Python數據分析攻略

代碼運行時間為68毫秒,比標準循環快321倍。但是,許多人建議不要使用它,因為仍然有更快的選項,而且iterrows()不能跨行保存dtype。

這意味著,如果你在DataFrame dtypes上使用iterrows(),可以更改它,但這會導致很多問題。

一定要保存dtypes的話,你還可以使用itertuples()。這里我們不詳細討論 ,你可以在這里找到官方文件:

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.itertuples.html

apply ()方法ー快811倍

apply 本身并不快,但與DataFrame結合使用時,它具有優勢。這取決于 apply 表達式的內容。如果可以在 Cython 空間中執行,那么apply要快得多,這里的示例就是這種情況。

大家可以在Lambda函數中使用apply。所要做的就是指定這個軸。在本文的示例中,想要執行按列操作,要使用 axis 1:

Pandas循環提速7萬多倍!Python數據分析攻略

這段代碼甚至比之前的方法更快,完成時間為27毫秒。

Pandas向量化—快9280倍

此外,也可以利用向量化的優點來創建非常快的代碼。

重點是避免像之前的示例中的Python級循環,并使用優化后的C語言代碼,這將更有效地使用內存。只需要稍微修改一下函數:

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

現在,可以用 Pandas 列作為輸入創建新列:

Pandas循環提速7萬多倍!Python數據分析攻略

在這種情況下,甚至不需要循環。所要做的就是調整函數的內容。現可以直接將Pandas 列傳遞給函數,從而獲得巨大的速度增益。

Numpy向量化—快71803倍

在上面的示例中,將將Pandas 列傳遞給函數。通過添加.values,可以得到一個Numpy數組:

Pandas循環提速7萬多倍!Python數據分析攻略

因為引用了局部性的好處,Numpy數組的速度非常快,代碼運行時間僅為0.305毫秒,比一開始使用的標準循環快71803倍。

誰更強一目了然

最后,Benedikt Droste對上述方案進行了總結。

他說,如果你使用Python、Pandas和Numpy進行數據分析,總會有改進代碼的空間。

在對上述五種方法進行比較之后,哪個更快一目了然:

Pandas循環提速7萬多倍!Python數據分析攻略

從這個圖中,可以得出兩個結論:

1、如果要使用循環,則應始終選擇apply方法。

2、否則,使用向量化是最好的,因為它更快!

 

責任編輯:張燕妮 來源: 量子位
相關推薦

2021-02-17 13:20:51

forpandas語言

2023-12-10 14:06:04

數據庫pythonduckdb

2020-06-05 14:29:07

PythonPandas數據分析

2024-01-09 13:58:22

PandasPython數據分析

2017-09-01 09:52:20

PythonPandas數據分析

2023-11-21 09:11:31

2022-11-11 11:35:14

2023-01-28 10:09:00

Pandas數據分析Python

2022-08-16 16:00:05

Python

2020-04-21 10:11:03

Python數據分析Pandas

2024-04-09 08:47:34

PandasRollingPython

2022-06-21 15:00:01

Python語言循環方式

2022-07-08 06:01:37

D-Tale輔助工具

2019-11-04 15:00:01

DatatableR語言數據科學

2021-12-24 10:45:19

PandasLambda數據分析

2020-07-07 14:35:41

Python數據分析命令

2022-03-24 09:36:28

Pandas數據分析代碼

2025-04-02 09:33:01

2023-05-05 18:45:21

Python人工智能機器學習

2024-10-16 09:34:50

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 97超在线视频 | 碰碰视频| 午夜精品久久久久久久久久久久久 | 日韩一区二区在线视频 | 国产精品一区二区三区在线 | 精品国产鲁一鲁一区二区张丽 | 日本欧美大片 | 日韩欧美国产一区二区 | 91精品国产综合久久久久久丝袜 | 五十女人一级毛片 | 日韩成人免费在线视频 | 91精品国产一区二区三区 | 男女羞羞视频在线观看 | 放个毛片看看 | 91精品一区二区三区久久久久久 | 国产目拍亚洲精品99久久精品 | 99热国产免费 | 自拍偷拍精品 | 99久久中文字幕三级久久日本 | 国产日韩精品久久 | 亚洲va中文字幕 | 国产精品99久久久久久宅男 | 精品国产一区二区三区在线观看 | 自拍偷拍一区二区三区 | 亚洲欧美综合精品久久成人 | 一区二区播放 | 91一区二区三区在线观看 | 国产欧美一区二区三区久久人妖 | 久草中文在线观看 | 亚洲一区二区在线电影 | 免费看爱爱视频 | www.久久久久久久久久久 | 久久美女网 | 欧美日韩国产精品激情在线播放 | 日本免费一区二区三区视频 | 国产欧美日韩在线 | 亚州精品天堂中文字幕 | 亚洲伊人a | 国内精品久久久久久 | 久久av网 | 亚洲国产福利视频 |