大家好,基于Python的数据科学实践课程第9期又到来了,大家尽情学习吧。本期内容主要由智亿同学与政委联合推出。
上一节通过火锅团购数据学习了:
学习如何使用Pandas进行切片操作;
学习如何进行统计描述分析;
同时介绍一些常用技巧。
这一节我们继续来学习Pandas这个神器的其他武功:
如何使用Pandas的apply()函数;
如何使用Pandas进行分组和聚合操作。
首先,咱们假设用Pandas已经读入数据,并且完成了去重与去缺失值(Pandas 1)。现在存储的数据名字为raw_data2。
// 1、apply()—为你私人定制的函数//Pandas内置的一些函数能非常方便的进行大部分数据处理,但是,现实中的场景往往得“按需定制”,内置的函数已经无法满足需求了。这可如何是好?
直观的想法就写个循环,一个个元素处理吧!这种循环最致命的硬伤是:速度得多慢?要知道,Python中的for循环恐怕是最耗时间的控制语句了,而且,和if语句组合,可能还得写好几个!
为了克服这样的困难,Pandas已经非常贴心的提供了apply()函数,能和Python的函数完美兼容!现在,我们使用apply()函数对上一节中的“人均”重新做清洗。
表1 apply()函数
例1 apply()函数
1def clean_price(x): 2 filter_words = ['人均:', '人均', '大概', '左右', '差不多']
3 if type(x) is int or type(x) is float: 4 return x 5 for word in filter_words: 6 if word in value: 7 x = x.replace(word, '')
8 return x
9
10raw_data2['人均'] = raw_data2['人均'].apply(clean_price)
11raw_data2['人均'] = raw_data2['人均'].astype(float)
12raw_data2.head()
上述代码效果等价于for循环+if条件判断,结果与之前一致。
好奇的宝宝可能就要问了:看上去程序还是用到了很多if判断,这和直接写for循环+if判断有什么区别呢?区别在于,apply()函数经过C的加速优化后,比Python原生的for循环要快出不少。二者分别的运行结果如表2。
表2 二者运行速度差别
apply方法比for循环的速度快了5.5倍!而且,还得注意一点——这个数据集的数据量还不足1000条,随着数据量的增加,这个速度差别会更加明显!可以说,会不会使用apply()函数就能在很大程度上看出区别!
// 2、分组与聚合——速度与优雅兼具//政委此时仿佛看破红尘,一缕胡须,自言自语道:请客吃饭的钱又不能报销,能不能找便宜又上档次的店家?(* ̄︶ ̄)微笑脸
这可又怎么办,总不能还写个 for循环+N个if判断 吧?apply?不行不行,这还是有N个if判断再循环相加,实在太不Pythonic了!这要传出去,还怎么混!
不怕,这一节,我们用分组聚合搞定这个问题!
分组聚合,顾名思义,就是把数据元素按照某些规则进行分组,再对其进行分别运算,最后聚合起来。原理如图1。
图1 分组聚合原理图
好奇的宝宝可能又要问了:Pandas是如何实现分组聚合的?就是下面这样喽:
1for i in range(len(df)):
2 if df['key'] == 'A':
3 print(df['data'].iloc[i])
4 if df['key'] == 'B':
5 print(df['data'].iloc[i])
6 ....
WTF....? for循环+if条件判断?当然不可能啦,这样写代码会累死。其实解决方法图1已经很明显地表示出来了:key + data —— 字典操作!
需要说明的是,字典分组非常快(字典是基于哈希运算的,时间复杂度是O(1));在聚合阶段,Pandas才会真正进行运算操作。这一机制也进一步加快了Pandas进行分组聚合的操作速度。具体函数如下:
表3 分组与聚合函数
例2 分组聚合
1def cate_shops(x):
2 if x <= 2:
3 return 0
4 if x > 2 and x <= 3.5:
5 return 1
6 if x > 3.5:
7 return 2
8
9raw_data2['商家等级'] = raw_data2['评分'].apply(cate_shops) #构建商家等级
10raw_data2.groupby(by=['商家等级']).agg({'人均': 'mean'}) #根据商家等级分组,然后对于人均按照均值进行整合
运行结果如图2。
图2 分组聚合运行结果
下面我们就用刚刚学到的分组聚合的功夫找到性价比最高的商家,为政委排忧解难。首先,按用户对商家的评分划分出三个等级:0、1、2,分别代表低级商户、中级商户、高级商户。再用分组聚合的方法计算出每个等级的人均消费(如果不用分组聚合如何实现?)。惊奇地发现,评分好的商家竟然人均也是最低的!(政委此时露出一丝狡黠的微笑,熊大你来吧,我不怕了哈哈)
当然,条条大路通罗马。并不是只有用聚合函数才能达到效果,一些简单的运算,如例子中的加法运算,还可以通过Pandas判断表达式来完成,在实际使用中视具体情况进行选择。
好了,今天就先介绍到这里。
作业:载入pandas包,读入shops_nm的文件。利用本节所学过的知识完成如下内容:首先根据人均消费给不同商家分成“高,中,低”三个消费群组;其次,计算每个群组的评分的均值,最大值与最小值。
▼往期精彩回顾▼初步搭建数据科学工作环境Conda的使用
Spyder入门
Jupyter入门
Markdown
简单读写数据
数据类型
数据结构
控制流
函数与模块
Numpy
pandas1
pandas2
点击这里下载数据