一文带你掌握常见的Pandas性能优化方法,让你的pandas飞起来!

微信公众号:「Python读财」
如有问题或建议,请公众号留言

Pandas是Python中用于数据处理与分析的屠龙刀,想必大家也都不陌生,但Pandas在使用上有一些技巧和需要注意的地方,尤其是对于较大的数据集而言,如果你没有适当地使用,那么可能会导致Pandas的运行速度非常慢。

对于程序猿/媛而言,时间就是生命,这篇文章给大家总结了一些pandas常见的性能优化方法,希望能对你有所帮助!

一、数据读取的优化

读取数据是进行数据分析前的一个必经环节,pandas中也内置了许多数据读取的函数,最常见的就是用pd.read_csv()函数从csv文件读取数据,那不同格式的文件读取起来有什么区别呢?哪种方式速度更快呢?我们做个实验对比一下。

这里采用的数据共59万行,分别保存为xlsxcsvhdf以及pkl格式,每种格式进行10次读取测试,得到下面的结果。

image

可以看到,对同一份数据,pkl格式的数据的读取速度最快,是读取csv格式数据的近6倍,其次是hdf格式的数据,速度最惨不忍睹的是读取xlsx格式的数据(这仅仅是一份只有15M左右大小的数据集呀)。

所以对于日常的数据集(大多为csv格式),可以先用pandas读入,然后将数据转存为pkl或者hdf格式,之后每次读取数据时候,便可以节省一些时间。代码如下:

 import pandas as pd
 #读取csv
 df = pd.read_csv('xxx.csv')

 #pkl格式
 df.to_pickle('xxx.pkl') #格式另存
 df = pd.read_pickle('xxx.pkl') #读取

 #hdf格式
df.to_hdf('xxx.hdf','df') #格式另存
df = pd.read_hdf('xxx.pkl','df') #读取

二、进行聚合操作时的优化

在使用aggtransform进行操作时,尽量使用Python的内置函数,能够提高运行效率。(数据用的还是上面的测试用例)

1、agg+Python内置函数

image

2、agg+非内置函数

image
可以看到对 agg 方法,使用内置函数时运行效率提升了60%。

3、transform+Python内置函数

image

4、transform+非内置函数

image

transform方法而言,使用内置函数时运行效率提升了两倍。

三、对数据进行逐行操作时的优化

假设我们现在有这样一个电力消耗数据集,以及对应时段的电费价格,如下图所示:

image

image

数据集记录着每小时的电力消耗,如第一行代表2001年1月13日零点消耗了0.586kwh的电。不同使用时段的电费价格不一样,我们现在的目的是求出总的电费,那么就需要将对应时段的单位电费×消耗电量。下面给出了三种写法,我们分别测试这三种处理方式,对比一下这三种写法有什么不同,代码效率上有什么差异。

#编写求得相应结果的函数
def get_cost(kwh, hour):
    if 0 <= hour < 7:
        rate = 0.6
    elif 7 <= hour < 17:
        rate = 0.68
    elif 17 <= hour < 24:
        rate = 0.75
    else:
        raise ValueError(f'Invalid hour: {hour}')
    return rate * kwh

#方法一:简单循环
def loop(df):
    cost_list = []
    for i in range(len(df)):
        energy_used = df.iloc[i]['energy_kwh']
        hour = df.iloc[i]['date_time'].hour
        energy_cost = get_cost(energy_used, hour)
        cost_list.append(energy_cost)
    df['cost'] = cost_list

#方法二:apply方法
def apply_method(df):
     df['cost'] = df.apply(
         lambda row: get_cost(
             kwh=row['energy_kwh'],
             hour=row['date_time'].hour),
         axis=1)

#方法三:采用isin筛选出各时段,分段处理
df.set_index('date_time', inplace=True)
def isin_method(df):
    peak_hours = df.index.hour.isin(range(17, 24))
    simple_hours = df.index.hour.isin(range(7, 17))
    off_peak_hours = df.index.hour.isin(range(0, 7))

    df.loc[peak_hours, 'cost'] = df.loc[peak_hours, 'energy_kwh'] * 0.75
    df.loc[simple_hours,'cost'] = df.loc[simple_hours, 'energy_kwh'] * 0.68
    df.loc[off_peak_hours,'cost'] = df.loc[off_peak_hours, 'energy_kwh'] * 0.6

测试结果:

image

可以看到,采用isin() 筛选出对应数据后分开计算的速度是简单循环的近606倍,这并不是说 isin() 有多厉害,方法三速度快是因为它采用了向量化的数据处理方式(这里的isin() 是其中一种方式,还有其他方式,大家可以尝试一下) ,这才是重点。什么意思呢?

这里简单画了个图,大家可以结合这个图和代码好好体会是一个一个处理快,还是把能进行相同操作的分开然后批量处理快。

image

四、使用numba进行加

如果在你的数据处理过程涉及到了大量的数值计算,那么使用numba可以大大加快代码的运行效率,numba使用起来也很简单,下面给大家演示一下。(代码处理不具有实际意义,只是展示一下效果)

首先需要安装numba模块

>>>pip install numba

我们用一个简单的例子测试一下numba的提速效果

import numba

@numba.vectorize
def f_with_numba(x): 
    return x * 2

def f_without_numba(x): 
    return x * 2

#方法一:apply逐行操作
df["double_energy"] = df.energy_kwh.apply(f_without_numba)

#方法二:向量化运行
df["double_energy"] = df.energy_kwh*2

#方法三:运用numba加速
#需要以numpy数组的形式传入
#否则会报错
df["double_energy"] = f_with_numba(df.energy_kwh.to_numpy())

image

从测试结果来看,再次凸显出向量化处理的优势,同时numba对原本速度已经很快的向量化处理也能提高一倍多的效率。更多numba的使用方法请参考numba的使用文档。

参考资料:

1、https://pandas.pydata.org/pan...

2、https://realpython.com/fast-f...

3、https://www.cnblogs.com/wkang...

原创不易,如果觉得有点用,希望可以随手点个赞,拜谢各位老铁。

扫码关注公众号「Python读财」,第一时间获取干货,还可以加Python学习交流群!!
公众号二维码.jpg

Image placeholder
zhouqi
未设置
  11人点赞

没有讨论,发表一下自己的看法吧

推荐文章
SpringBoot 深度调优,让你的项目飞起来!

项目调优作为一名工程师,项目调优这事,是必须得熟练掌握的事情。在SpringBoot项目中,调优主要通过配置文件和配置JVM的参数的方式进行。一、修改配置文件关于修改配置文件application.p

华为“鸿蒙”所涉及的微内核到底是什么?一文带你认识微内核

微内核最近微内核的概念常常被大家提及,同时还有GoogleFuchisa这样的微内核新星,这里让我们一起来认识下微内核吧。背景庞大的UNIX家族计算机技术在二战后快速发展,构成计算机的主要基本单元从电

30分钟让你掌握Git的黑魔法

本文转载自云效公众号在GitRevNews#48期的LightReading中有一篇文章写的不错,不仅干货满满而且还附带了操作视频。其中的内容不仅覆盖了很多git使用上的基础知识,也从使用角度上解答了

MySQL 性能优化:8 种常见 SQL 错误用法!

1、LIMIT语句分页查询是最常用的场景之一,但也通常也是最容易出问题的地方。比如对于下面简单的语句,一般DBA想到的办法是在type,name,create_time字段上加组合索引。这样条件排序都

看得见的“岛”与看不见的“智慧”

俗话说:“耳听为虚,眼见为实”。都说华为把福州海峡国际会展中心所在的小岛,打造成了“智慧岛”。您亲眼所见了吗?  我亲眼所见了!并且有图有真相!我来带您全方位的去逛一逛!  您看得见场馆大门的闸机,但

建立开放的大数据精准扶贫平台,让全社会参与进来!

精准扶贫”的重要思想最早是在2013年11月,习近平主席到湖南湘西考察时首次作出了“实事求是、因地制宜、分类指导、精准扶贫”的重要指示。2015年6月,习近平主席在贵州召开部分省区市党委主要负责同志座

开发中常见的Oracle三大故障与调优方法

墨墨导读:怀晓明先生(网名lastwinner),是具有多年数据库开发与项目管理经验的数据库专家。曾获得第一届ITPUB较佳建议奖,在多个大型IT企业多年的工作历练中,积累了丰富的系统架构设计经验。合

Python面试|一文让你读懂if __name__==’__main__’的含义

程序入口对于很多编程语言来说,程序都必须要有一个入口,比如C,C++,以及完全面向对象的编程语言Java,C#等。如果你接触过这些语言,对于程序入口这个概念应该很好理解,C和C++都需要有一个main

MySQL 亿级数据数据库优化方案测试-银行交易流水记录的查询

作者:逸宸a链接:https://www.jianshu.com/p/cbdef47fb837对MySQL的性能和亿级数据的处理方法思考,以及分库分表到底该如何做,在什么场景比较合适?比如银行交易流水

Hadoop YARN:调度性能优化实践

背景YARN作为Hadoop的资源管理系统,负责Hadoop集群上计算资源的管理和作业调度。美团的YARN以社区2.7.1版本为基础构建分支。目前在YARN上支撑离线业务、实时业务以及机器学习业务。离

etcd 在超大规模数据场景下的性能优化

作者|阿里云智能事业部高级开发工程师 陈星宇(宇慕)划重点etcd优化背景问题分析优化方案展示实际优化效果本文被收录在5月9日cncf.io官方blog中,链接:https://www.cncf.io

Elasticsearch 亿级数据检索性能优化案例实战!

一、前言数据平台已迭代三个版本,从头开始遇到很多常见的难题,终于有片段时间整理一些已完善的文档,在此分享以供所需朋友实现参考,少走些弯路,在此篇幅中偏重于ES的优化,关于HBase,Hadoop的设计

一场HBase2.x的写入性能优化之旅

本文通过实战跑分来展示HBase2.x的写入性能首先,简单介绍一下我们的测试环境:集群由5个节点组成,每个节点有12块800GB的SSD盘、24核CPU、128GB内存;集群采用HBase和HDFS混

Xcode调试、性能优化基本工具使用简单整理

断点1.普通断点在行号那儿点一下就加上了,最常用的断点,略。2.条件断点很多时候问题代码是被高频调用直到特定条件下才出现问题的,这种时候可以使用条件断点。在任意断点右击选择EditBreakpoint

如何将网站的php版本信息隐藏起来

当我们把网站上线之后,我们可以通过curl的如下命令显示指定网站的头信息,curl的安装方法参考:https://www.wj0511.com/site/d...curl-Ihttps://www.w

爽到飞起!微软命令行工具发布!引诱开发者叛逃Mac,开源六小时冲上GitHub第二

晓查栗子乾明发自凹非寺转自量子位 |公众号QbitAIWoW!Awesome!MyGod!这是不少抱着Mac参加微软Build大会的开发者,看到命令行工具WindowsTerminal后的第一反应。随

DTCC2019 :“数据架构设计实践专场”等您来!

  2019年5月8日~5月10日,由IT168旗下ITPUB企业社区平台主办的第十届中国数据库技术大会(DTCC2019),将在北京新云南大酒店召开。本次大会将以“数据风云,十年变迁”为主题,邀请百

win10美化,让你的win10独一无二,与众不同!

1.原则美化之前,得先有一个目标对不对,笔者是一个喜欢简单的人,因此美化本着三大原则:简单,干净,整洁.呃....好像很抽象的样子,上图吧.反正没图没真相.怎么样,还可以吧,没有任何多余的东西.再来一

一文读懂数据库70年发展史

作者:常垒资本 冯斯基顾问:云和恩墨、戴工玖、周家晶零1949-19791956年,周恩来总理亲自领导了“科学技术发展十二年规划”,标志着我国计算机事业的开始。而那时,几乎没有人知道计算技术是怎么回事

一文学会Java死锁和CPU 100% 问题的排查技巧

00本文简介作为一名搞技术的程序猿或者是攻城狮,想必你应该是对下面这两个问题有所了解,说不定你在实际的工作或者面试就有遇到过:第一个问题:Java死锁如何排查和解决?第二个问题:服务器CPU占用率高达

一文读懂HBase多租户

本文从三个方面介绍了HBase的多租户实现。上篇文章回顾:HDFS短路读详解多租户(multi-tenancytechnology),参考维基百科定义,它是在探讨与实现如何于多用户的环境下共享相同的系

一文告诉你全世界最顶级的开发者都在使用什么数据库

作为一名IT行业从业者,其实从去年已经隐隐约约感觉到数据库的有变化,只是没有想到变得这么快。今年的一些事情实实在在地给了某些数据库重击,如果以前去某数据库还是喊喊,然后该用还用,今年从传统领域刮起的去

一文读懂原码、反码与补码

一、二进制二进制和十进制一样,也是一种进位计数制,但是它的基数是2。二进制表达式中0和1的位置不同,它所代表的数值也不同。例如,二进制数00001010表示十进制数10。一个二进制数具有两个基本特点:

2020年前必须掌握的数据库面试问题~

一、为什么用自增列作为主键1、如果我们定义了主键(PRIMARYKEY),那么InnoDB会选择主键作为聚集索引。如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索

新突破!人工智能会根据你的声音来预测你的长相

麻省理工学院的研究人员发明了一种新的人工智能,它实现了一项惊人的成就:仅通过分析一个人声音的短片段,它就能重建他们在现实生活中的样子。人工智能的预测结果并不完美,但总的来说还是相当不错的,这项研究也是