在线客服
扫描二维码
下载博学谷APP
扫描二维码
关注博学谷微信公众号
Pandas作为数据分析的屠龙宝刀,毫不夸张的说,功能和优势都极其强大。像是支持GB数据处理,多样的数据清洗方法;支持多种开源可视化工具包,更加丰富的数据成果展示等等。因此如果能做好性能优化,就可以极大的提高Pandas的运行速度。本文为大家总结了四大优化Pandas性能的方法,感兴趣的朋友就赶紧看下去吧!

1、数据读取的优化
读取数据是进行数据分析前的一个必经环节,pandas中也内置了许多数据读取的函数,最常见的就是用pd.read_csv()函数从csv文件读取数据。pkl格式的数据的读取速度最快,所以对于日常的数据集(大多为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') #读取
2、进行聚合操作时的优化
在使用 agg 和 transform 进行操作时,尽量使用Python的内置函数,能够提高运行效率。(数据用的还是上面的测试用例)
(1)agg+Python内置函数

(2)agg+非内置函数

可以看到对 agg 方法,使用内置函数时运行效率提升了60%。
(3)transform+Python内置函数

(4)transform+非内置函数

对 transform 方法而言,使用内置函数时运行效率提升了两倍。
3、对数据进行逐行操作时的优化
假设我们现在有这样一个电力消耗数据集,以及对应时段的电费价格。数据集记录着每小时的电力消耗,如第一行代表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
测试结果:
可以看到,采用 isin() 筛选出对应数据后分开计算的速度是简单循环的近606倍,这并不是说 isin() 有多厉害,方法三速度快是因为它采用了向量化的数据处理方式(这里的isin() 是其中一种方式,还有其他方式,大家可以尝试一下) ,这才是重点。
4、使用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())
从测试结果来看,再次凸显出向量化处理的优势,同时numba对原本速度已经很快的向量化处理也能提高一倍多的效率。更多numba的使用方法请参考numba的使用文档。
以上就是提高Pandas运行速度的优化方法,大家都get到了吗?如果想要学习Pandas的实战教程,可以上博学谷官网在线学习《数据分析进阶必备技能:Pandas》课程,想要了解课程的更多内容,可以点击课程链接https://www.boxuegu.com/promote/detail-1480.html
— 申请免费试学名额 —
在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!
相关推荐 更多
零基础学习Python 基础知识入门篇
众所周知,Python是一门集优雅、明确和简单于一体的编程语言,近来随着Python语言在各个行业领域的广泛运用,Python的学习者是越来越多。本文为大家整理了零基础小白入门Python的必需要学习的一些基础知识,内容包括标识符、关键字、引号、编码、输入输出、缩进、多行、注释、数据类型等等。有学习需要的小伙伴赶紧看下去吧!
8434
2019-11-03 22:23:49
5种好用的Python工具分享
Python开发软件可根据其用途不同分为两种,Python代码编辑器和Python集成开发工具,两者配合使用极大的提高Python开发人员的编程效率。掌握调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制等操作。
7869
2020-04-07 16:46:14
set数据结构基础学习笔记
set又叫集合,它是⼀个十分重要的数据结构。它行为与数据结构列表数据结构相似,不同之处在于区别在于set包含重复的值。下面我们一起来看看set数据结构的概念、使用场景以及数学运算,总结梳理一下set数据结构的基础学习笔记。
7068
2020-06-29 10:02:32
Python与C语言的区别是什么?
Python与C语言的区别:Python是由C语言实现,C语言是编译型语言,经过编译后生成机器码再运行,执行速度快不能跨平台,一般用于操作系统驱动等底层开发。Python是理解为解释型语言执行速度慢,由于Python虚拟机可以跨平台,Python高度集成适合于软件的快速开发。
9309
2021-03-12 16:46:44
如何修改goods表结构?怎么操作?
如何修改goods表结构?怎么操作?修改表结构可以使用: alter table语句,多个修改字段之间使用逗号分隔,使数据库中表的字段名称标准化便于查找。
7308
2022-01-25 10:21:06
