python数据科学手册_Python数据科学实践 | Pandas 3

676745b8dd9e7f033c5f34e119457068.gif 84add4ce48dfc2d4523affd634e8b542.png

526c5262767c626fb469e28b383d0f85.png

大家好,基于Python的数据科学实践课程第9期又到来了,大家尽情学习吧。本期内容主要由智亿同学与政委联合推出。

上一节通过火锅团购数据学习了:

  • 学习如何使用Pandas进行切片操作;

  • 学习如何进行统计描述分析;

  • 同时介绍一些常用技巧。

这一节我们继续来学习Pandas这个神器的其他武功:

  • 如何使用Pandas的apply()函数;

  • 如何使用Pandas进行分组和聚合操作。

首先,咱们假设用Pandas已经读入数据,并且完成了去重与去缺失值(Pandas 1)。现在存储的数据名字为raw_data2。

// 1、apply()—为你私人定制的函数//

Pandas内置的一些函数能非常方便的进行大部分数据处理,但是,现实中的场景往往得“按需定制”,内置的函数已经无法满足需求了。这可如何是好?

直观的想法就写个循环,一个个元素处理吧!这种循环最致命的硬伤是:速度得多慢?要知道,Python中的for循环恐怕是最耗时间的控制语句了,而且,和if语句组合,可能还得写好几个!

为了克服这样的困难,Pandas已经非常贴心的提供了apply()函数,能和Python的函数完美兼容!现在,我们使用apply()函数对上一节中的“人均”重新做清洗。

表1 apply()函数

02c45097d54eba0eac8b588a14201217.png

例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 二者运行速度差别

8307c71c6936e91a3cd0b8b5f9167aad.png

apply方法比for循环的速度快了5.5倍!而且,还得注意一点——这个数据集的数据量还不足1000条,随着数据量的增加,这个速度差别会更加明显!可以说,会不会使用apply()函数就能在很大程度上看出区别!

// 2、分组与聚合——速度与优雅兼具//

政委此时仿佛看破红尘,一缕胡须,自言自语道:请客吃饭的钱又不能报销,能不能找便宜又上档次的店家?(* ̄︶ ̄)微笑脸

这可又怎么办,总不能还写个 for循环+N个if判断 吧?apply?不行不行,这还是有N个if判断再循环相加,实在太不Pythonic了!这要传出去,还怎么混!

不怕,这一节,我们用分组聚合搞定这个问题!

分组聚合,顾名思义,就是把数据元素按照某些规则进行分组,再对其进行分别运算,最后聚合起来。原理如图1。

15e6d149970767868159add8e552ca4f.png

图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 分组与聚合函数

8a3c97c5f9a07c77e6ed7fccd1750fce.png

例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。

872124abd3c6ee4eb6044a5f216ea876.png

图2 分组聚合运行结果

下面我们就用刚刚学到的分组聚合的功夫找到性价比最高的商家,为政委排忧解难。首先,按用户对商家的评分划分出三个等级:0、1、2,分别代表低级商户、中级商户、高级商户。再用分组聚合的方法计算出每个等级的人均消费(如果不用分组聚合如何实现?)。惊奇地发现,评分好的商家竟然人均也是最低的!(政委此时露出一丝狡黠的微笑,熊大你来吧,我不怕了哈哈)

当然,条条大路通罗马。并不是只有用聚合函数才能达到效果,一些简单的运算,如例子中的加法运算,还可以通过Pandas判断表达式来完成,在实际使用中视具体情况进行选择。

好了,今天就先介绍到这里。

作业:载入pandas包,读入shops_nm的文件。利用本节所学过的知识完成如下内容:首先根据人均消费给不同商家分成“高,中,低”三个消费群组;其次,计算每个群组的评分的均值,最大值与最小值。

▼往期精彩回顾▼初步搭建数据科学工作环境

Conda的使用

Spyder入门

Jupyter入门

Markdown

简单读写数据

数据类型

数据结构

控制流

函数与模块

Numpy

pandas1

pandas2

97fb11bc516382b48db585531b516102.png dc9ab86b3bbe246cd4a12986aa6786e7.png点击这里下载数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值