社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python数据科学实践 | Pandas 3

狗熊会 • 4 年前 • 490 次点击  

大家好,基于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(xis int or type(xis 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


点击这里下载数据
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/47083
 
490 次点击