加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

数据处理赏罚必看:怎样让你的Pandas轮回加速71803倍

发布时间:2019-08-28 04:30:07 所属栏目:教程 来源:skura
导读:雷锋网 AI 开拓者按,假如你行使 python 和 pandas 举办数据说明,那么不久你就会第一次行使轮回了。然而,纵然是对小型数据集,行使尺度轮回也很费时,你很快就会心识到大型数据帧也许必要很长的时刻。当我第一次等了半个多小时来执行代码时,我找到了接
副问题[/!--empirenews.page--]

数据处理赏罚必看:怎样让你的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 空间中执行,则速率会更快(在这里就是这种环境)。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读