ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-01-28 10:35:18  阅读:190  来源: 互联网

标签:category 01 tmall df 实用 raw 速率 pandas


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

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


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

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

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

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

目录

一、筛选掉不必要的数据

我们很多时候用到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()来提高速度和语法。

结束语

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


推荐关注的专栏

标签:category,01,tmall,df,实用,raw,速率,pandas
来源: https://blog.csdn.net/qq_44186838/article/details/122716310

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有