如何在工作中提高pandas运行速率?【超实用方法整理】

如何在工作中提高pandas运行速率?【超实用方法整理】,第1张

如何在工作中提高pandas运行速率?【超实用方法整理】

大家早上好,本人姓吴,如果觉得文章写得还行的话也可以叫我吴老师。欢迎大家跟我一起走进数据分析的世界,一起学习!

感兴趣的朋友可以关注我的数据分析专栏,里面有许多优质的文章跟大家分享哦。


大家都知道pandas计算功能非常厉害,运行速率也非常的快。通常情况下我们都不用去考虑怎么缩短运行的时间,因为往往一小会就运行完了。

但是,在现如今这个大数据的时代,特别是经常要与数据打交道的数据分析师 / 数据工程师,往往会处理到上百万甚至千万级别的数据,这个时候就不得不考虑以下如何使用恰当,或者说好用的方法来提升运行速率了。

那么今天,我给大家整理了工作学习中可以用到的几种提升pandas运行速率的思维或方法。

目前整理了最常见的四种情况,后续可能会不断更新,大家可以先收藏着。

目录

一、筛选掉不必要的数据二、一行代替多行运算三、用isin代替或(|)四、尽量使用矢量化 *** 作结束语

一、筛选掉不必要的数据

我们很多时候用到pandas都是写好指定的条件,然后再对dataframe进行一系列运算,如:

df_power = df[(df.category == '功能饮料')]
print(df_power['sales].sum())

这里实现的就是求出category为功能饮料的销售额总和。

那么这样子写是ok的,完全没有问题,那如果是想要天猫平台的category为功能饮料的销售额总和呢?

df_tmall_power = df[(df.category == '功能饮料') & ((df.platform == '天猫'))]
print(df_tmall_power['sales].sum())

这样子写ok吗?
答案是ok的,哈哈。

但这里有个问题,如果说我们只需要用到天猫平台的数据,并且需要经常求天猫平台中各式各样的数据,那么我们就不能一直这么写,应该直接就先把df换成df_tmall,也就是这样:

df_tmall = df[((df.platform == '天猫'))]
df_tmall_power = df_tmall[(df_tmall.category == '功能饮料') & ((df_tmall.platform == '天猫'))]
print(df_tmall_power['sales].sum())

总之一句话,如果只是在些特定范围内做 *** 作的话,并且要 *** 作多次的,可以先把那个dataframe给它筛一筛,这样子运行速度会快很多很多。

二、一行代替多行运算

第一种

df_raw.loc[(df_raw.category == '果汁') & (df_raw.brand == '美汁源') & (df_raw.month == '2020-01-01'), ['values']] = 100
df_raw.loc[(df_raw.category == '果汁') & (df_raw.brand == '美汁源') & (df_raw.month == '2020-01-01'), ['units']] = 20
df_raw.loc[(df_raw.category == '果汁') & (df_raw.brand == '美汁源') & (df_raw.month == '2020-01-01'), ['price']] = 5

第二种

df_raw.loc[(df_raw.category == '果汁') & (df_raw.brand == '美汁源') & (df_raw.month == '2020-01-01'), ['values', 'units', 'price']] = 100, 20, 5

第二种效率远高于第一种。

三、用isin代替或(|)

第一种

df_plat = df[(df.platform == 'PDD') | (df.platform == 'Tmall') | (df.platform == 'JD')]

第二种

df_plat = df[(df.platform.isin(['PDD', 'Tmall', 'JD']))]

第二种效率远高于第一种。

四、尽量使用矢量化 *** 作

这点就比较基础了,有些刚上手pandas的朋友可能没意识到pandas是可以直接对多行数据,或者说全部数据进行修改的,并且以为需要向以往接触到的list、dict一样,进行for循环 *** 作,这样子就真的太浪费pandas了,大材小用了属于是。

举个例子,现在有一个表格,其中一个字段名是grade,现在想要求出grade大于等于90的人数。

第一种(for循环)

list_grade = df['grade'].tolist()
count = 0
for i in list_grade:
	if i >= 90:
		count += 1
print(count)

第二种(矢量化 *** 作)

print(df[df.grade >= 90].shape[0])

比较之后我们不难发现,使用矢量化 *** 作不仅运行速率会更快,而且代码也简洁了许多。

注:如果真的不得不用到for循环,请使用.iterrows()或.itertuples()来提高速度和语法。

结束语

看完这篇,还有更多知识点分享给你哦,自己慢慢找哈,就在下面链接。


推荐关注的专栏

‍‍‍ 机器学习:分享机器学习实战项目和常用模型讲解
‍‍‍ 数据分析:分享数据分析实战项目和常用技能整理

往期内容回顾

学习Python全套代码【超详细】Python入门、核心语法、数据结构、Python进阶【致那个想学好Python的你】
❤️ 学习pandas全套代码【超详细】数据查看、输入输出、选取、集成、清洗、转换、重塑、数学和统计方法、排序
学习NumPy全套代码【超详细】基本 *** 作、数据类型、数组运算、复制和试图、索引、切片和迭代、形状 *** 作、通用函数、线性代数
【工作必备技能整理】EXCEL上能做的,openpyxl都能做到【接力pandas】


关注我,了解更多相关知识!

CSDN@报告,今天也有好好学习

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5716227.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存