相关文章推荐
不拘小节的毛衣  ·  pandas.DataFrame删除/选取含 ...·  2 周前    · 
旅途中的牛腩  ·  python ...·  2 周前    · 
绅士的创口贴  ·  震惊! ...·  2 天前    · 
被表白的橙子  ·  使用Python ...·  2 天前    · 
率性的玉米  ·  福建省网上办事大厅-福建政务服务网-马上就办 ...·  1 年前    · 
逃课的针织衫  ·  第33话 因果循环-孤芳不自赏-漫画牛·  2 年前    · 
慷慨大方的番茄  ·  物产中大(SH600704)股票股价_股价行 ...·  2 年前    · 
奔跑的警车  ·  我的幸福婚姻-哔哩哔哩_Bilibili·  2 年前    · 
不羁的鸵鸟  ·  毒妃在上,邪王在下(惹到他了)漫画全集免费( ...·  2 年前    · 
Code  ›  Pandas循环提速7万多倍!Python数据分析攻略开发者社区
数据分析 大数据 pandas dataframe
https://cloud.tencent.com/developer/article/1496994
慈祥的数据线
2 年前
作者头像
量子位
0 篇文章

Pandas循环提速7万多倍!Python数据分析攻略

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 量子位 > Pandas循环提速7万多倍!Python数据分析攻略

Pandas循环提速7万多倍!Python数据分析攻略

作者头像
量子位
发布 于 2019-09-02 16:49:24
1.2K 0
发布 于 2019-09-02 16:49:24
举报
乾明 编译整理 量子位 报道 | 公众号 QbitAI

用Python和Pandas进行数据分析,很快就会用到循环。

但在这其中,就算是较小的DataFrame,使用标准循环也比较耗时。

遇到较大的DataFrame时,需要的时间会更长,会让人更加头疼。

现在,有人忍不了了。他是一位来自德国的数据分析师,名叫Benedikt Droste。

他说,当自己花了大半个小时等待代码执行的时候,决定寻找速度更快的替代方案。

在给出的替代方案中,使用Numpy向量化,与使用标准循环相比,速度提升了71803倍。

他是怎么实现的?我们一起来看看~

标准循环处理3年足球赛数据:20.7秒

DataFrame是具有行和列的Pandas对象。如果使用循环,需要遍历整个对象。

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

需要解决的问题是:创建一个新的列,用于指示某个特定的队是否打了平局。可以这样开始:

def soc_loop(leaguedf,TEAM,):
    leaguedf['Draws'] = 99999
    for row in range(0, len(leaguedf)):
        if ((leaguedf['HomeTeam'].iloc[row] == TEAM) & (leaguedf['FTR'].iloc[row] == 'D')) | \
            ((leaguedf['AwayTeam'].iloc[row] == TEAM) & (leaguedf['FTR'].iloc[row] == 'D')):
            leaguedf['Draws'].iloc[row] = 'Draw'
        elif ((leaguedf['HomeTeam'].iloc[row] == TEAM) & (leaguedf['FTR'].iloc[row] != 'D')) | \
            ((leaguedf['AwayTeam'].iloc[row] == TEAM) & (leaguedf['FTR'].iloc[row] != 'D')):
            leaguedf['Draws'].iloc[row] = 'No_Draw'
        else:
            leaguedf['Draws'].iloc[row] = 'No_Game'

在这个案例中是阿森纳,在实现目标之前要确认阿森纳参加了哪些场比赛,是主队还是客队。但使用标准循环非常慢,执行时间为20.7秒。

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

Pandas 内置函数: iterrows ()ー快321倍

在第一个示例中,循环遍历了整个DataFrame。iterrows()为每一行返回一个Series,它以索引对的形式遍历DataFrame,以Series的形式遍历感兴趣的列。这使得它比标准循环更快:

def soc_iter(TEAM,home,away,ftr):
    #team, row['HomeTeam'], row['AwayTeam'], row['FTR']
    if [((home == TEAM) & (ftr == 'D')) | ((away == TEAM) & (ftr == 'D'))]:
        result = 'Draw'
    elif [((home == TEAM) & (ftr != 'D')) | ((away == TEAM) & (ftr != 'D'))]:
        result = 'No_Draw'
    else:
 
推荐文章
不拘小节的毛衣  ·  pandas.DataFrame删除/选取含有特定数值的行或列 - 二十四桥_明月夜
2 周前
旅途中的牛腩  ·  python dataframe用第二行作为column名_mob64ca12dcc794的技术博客_
2 周前
绅士的创口贴  ·  震惊! 居然可以用python在短短几秒内处理几十亿数据!_vaex
2 天前
被表白的橙子  ·  使用Python Pandas处理亿级数据开发者社区
2 天前
率性的玉米  ·  福建省网上办事大厅-福建政务服务网-马上就办 · 全程网办 · 一网通办
1 年前
逃课的针织衫  ·  第33话 因果循环-孤芳不自赏-漫画牛
2 年前
慷慨大方的番茄  ·  物产中大(SH600704)股票股价_股价行情_财报_数据报告 - 雪球
2 年前
奔跑的警车  ·  我的幸福婚姻-哔哩哔哩_Bilibili
2 年前
不羁的鸵鸟  ·  毒妃在上,邪王在下(惹到他了)漫画全集免费(下拉式)阅读-仙漫网
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号