大家早上好,本人姓吴,如果觉得文章写得还行的话也可以叫我吴老师。欢迎大家跟我一起走进数据分析的世界,一起学习!
感兴趣的朋友可以关注我的数据分析专栏,里面有许多优质的文章跟大家分享哦。
大家都知道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@报告,今天也有好好学习
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)