使用 Pandas 更好地做数据科学(二)

栏目: 数据库 · 发布时间: 5年前

之前分享过一篇 使用Pandas更好的做数据科学今天我们将学习pandas中的风骚操作:

  • df.resample: 重新采样

  • df.agg: 聚合(对列进行聚合操作)

  • df.groupby: 分组

agg它提供基于 列的聚合操作 。而groupby可以看做是基于行的聚合操作。

从实现上看,groupby返回的是一个DataFrameGroupBy结构,这个结构必须调用聚合函数(如sum)之后,才会得到结构为Series的数据结果。

而agg是DataFrame的直接方法,返回的也是一个DataFrame。当然,很多功能用sum、mean等等也可以实现。但是agg更加简洁, 而且传给它的函数可以是字符串,也可以自定义,参数是column对应的子DataFrame

import pandas as pd

df = pd.read_excel("sample-salesv3.xlsx")

#查看前5行
df.head()

使用 Pandas 更好地做数据科学(二)

将将日期字符串转化为pandas里的datetime类,这样可以使用一些高级用法

#df.date = pd.to_datetime(df.date)  该写法与下面一行作用等同
df["date"] = pd.to_datetime(df['date'])
df.head()

使用 Pandas 更好地做数据科学(二)

将date转化为dataframe中的index,使用df.set_index(colname),这里我们

df.set_index('date')
#注意df.set_index('date', inplace=True)的区别

使用 Pandas 更好地做数据科学(二)

我们统计ext price在每个月的累和(sum)值。

(重点的resample、groupby和agg在广告之后,亲们可以点点广告放松放松。精彩马上就来)

df.resample

重新采样,是对原样本重新处理的一个方法,是一个对常规时间序列数据重新采样和频率转换的便捷的方法。

  • 注意:resample 只有在index为datetime类型(pandas的datetime类型)的时候才能用

  • resample()的参数为Y、M、D分别表示从年、月、日水平上从数据中抽样

#每隔20天作为周期抽样,计算每个周期内ext price的累积和
df.set_index('date').resample('20D')['account number'].sum()

运行结果

date
2014-01-01 07:21:51    47757800
2014-01-21 07:21:51    37163241
2014-02-10 07:21:51    36028996
2014-03-02 07:21:51    36124347
2014-03-22 07:21:51    48225563
2014-04-11 07:21:51    43983337
2014-05-01 07:21:51    41839607
2014-05-21 07:21:51    40654505
2014-06-10 07:21:51    39456582
2014-06-30 07:21:51    47094772
2014-07-20 07:21:51    37634500
2014-08-09 07:21:51    34500589
2014-08-29 07:21:51    35385650
2014-09-18 07:21:51    41619350
2014-10-08 07:21:51    40574001
2014-10-28 07:21:51    34540767
2014-11-17 07:21:51    37910846
2014-12-07 07:21:51    41859385
2014-12-27 07:21:51     6582924
Name: account number, dtype: int64

从上面的运行结果,我们看到日期大概是以20天为间隔,从数据集中抽样。

#以月作为周期抽样,计算每个周期内ext price的累积和
df.set_index('date').resample('M')['ext price'].sum()

运行结果

date
2014-01-31    185361.66
2014-02-28    146211.62
2014-03-31    203921.38
2014-04-30    174574.11
2014-05-31    165418.55
2014-06-30    174089.33
2014-07-31    191662.11
2014-08-31    153778.59
2014-09-30    168443.17
2014-10-31    171495.32
2014-11-30    119961.22
2014-12-31    163867.26
Freq: M, Name: ext price, dtype: float64

更进一步,我们想知道每个用户每个月的sum值,那么就需要一个groupby了:

df.groupby()-分组

df.set_index('date').groupby('name')['ext price'].resample("M").sum()
#效果等同的代码 df.groupby(['name', pd.Grouper(key='date', freq='M')])['ext price'].sum()

运行结果

name                             date      
Barton LLC                       2014-01-31     6177.57
                                 2014-02-28    12218.03
                                 2014-03-31     3513.53
                                 2014-04-30    11474.20
                                 2014-05-31    10220.17
                                 2014-06-30    10463.73
                                 2014-07-31     6750.48
                                 2014-08-31    17541.46
                                 2014-09-30    14053.61
                                 2014-10-31     9351.68
                                 2014-11-30     4901.14
                                 2014-12-31     2772.90
Cronin, Oberbrunner and Spencer  2014-01-31     1141.75
                                 2014-02-28    13976.26
                                 2014-03-31    11691.62
                                 2014-04-30     3685.44
                                 2014-05-31     6760.11
                                 2014-06-30     5379.67
                                 2014-07-31     6020.30
                                 2014-08-31     5399.58
                                 2014-09-30    12693.74
                                 2014-10-31     9324.37
                                 2014-11-30     6021.11
                                 2014-12-31     7640.60
Frami, Hills and Schmidt         2014-01-31     5112.34
                                 2014-02-28     4124.53
                                 2014-03-31    10397.44
                                 2014-04-30     5036.18
                                 2014-05-31     4097.87
                                 2014-06-30    13192.19
                                                 ...   
Trantow-Barrows                  2014-07-31    11987.34
                                 2014-08-31    17251.65
                                 2014-09-30     6992.48
                                 2014-10-31    10064.27
                                 2014-11-30     6550.10
                                 2014-12-31    10124.23
White-Trantow                    2014-01-31    13703.77
                                 2014-02-28    11783.98
                                 2014-03-31     8583.05
                                 2014-04-30    19009.20
                                 2014-05-31     5877.29
                                 2014-06-30    14791.32
                                 2014-07-31    10242.62
                                 2014-08-31    12287.21
                                 2014-09-30     5315.16
                                 2014-10-31    19896.85
                                 2014-11-30     9544.61
                                 2014-12-31     4806.93
Will LLC                         2014-01-31    20953.87
                                 2014-02-28    13613.06
                                 2014-03-31     9838.93
                                 2014-04-30     6094.94
                                 2014-05-31    11856.95
                                 2014-06-30     2419.52
                                 2014-07-31    11017.54
                                 2014-08-31     1439.82
                                 2014-09-30     4345.99
                                 2014-10-31     7085.33
                                 2014-11-30     3210.44
                                 2014-12-31    12561.21
Name: ext price, Length: 240, dtype: float64

对比两种写法

#A写法
df.set_index('date').groupby('name')['ext price'].resample("M").sum()

#B写法
df.groupby(['name', pd.Grouper(key='date', freq='M')])['ext price'].sum()

显然, B写法 多敲了很多次键盘,那么它的好处是啥呢?

  • 首先,逻辑上更加直接,当你敲代码完成以上统计的时候,你首先想到的就是groupby操作,而set_index, resample好像不会立马想到。

  • 想到了groupby这个'动作'之后,你就会紧接着想按照哪个key来操作,此时你只需要用字符串,或者Grouper把key定义好就行了。

  • 最后使用聚合函数sum(),就得到了结果。

所以,从代码可读性角度看, B写法 更容易记忆。

df.agg

agg它提供基于 列的聚合操作 。而groupby可以看做是基于行的聚合操作。

从实现上看,groupby返回的是一个DataFrameGroupBy结构,这个结构必须调用聚合函数(如sum)之后,才会得到结构为Series的数据结果。

而agg是DataFrame的直接方法,返回的也是一个DataFrame。

当然,很多功能用sum、mean等等也可以实现。但是agg更加简洁, 而且传给它的函数可以是字符串,也可以自定义,参数是column对应的子DataFrame

#df[["ext price", "quantity", "unit price"]]返回的是pd.DataFrame类型
#df["ext price", "quantity", "unit price"]返回的是pd.Series类型
df[["ext price", "quantity", "unit price"]].agg(['sum', 'mean'])

使用 Pandas 更好地做数据科学(二)

df.agg-针对不同的列使用不同的聚合函数

df.agg({'ext price': ['sum', 'mean'], 
        'quantity': ['sum', 'mean'], 
        'unit price': ['mean']})

使用 Pandas 更好地做数据科学(二)

往期文章

聊天机器人:十行代码让你秒变撩妹达人

100G 文本分析语料资源(免费下载)   

15个最好的数据科学领域 Python

使用Pandas更好的做数据科学

抓取8w技能交换公告信息

视频讲解】Scrapy递归抓取简书用户信息

美团商家信息采集神器

大邓强力推荐-jupyter notebook使用小技巧

10分钟理解深度学习中的~卷积~

深度学习之 图解LSTM

PyTorch实战: 使用卷积神经网络对照片进行分类

Pytorch实战:使用RNN网络对姓名进行分类

数据清洗 常用正则表达式大全

PySimpleGUI: 开发自己第一个软件

深度特征合成:自动生成机器学习中的特征

Python 3.7中dataclass的终极指南(一)

Python 3.7中dataclass的终极指南(二)

[计算消费者的偏好]推荐系统与协同过滤、奇异值分解

机器学习: 识别图片中的数字

应用PCA降维加速模型训练

如何从文本中提取特征信息?

使用sklearn做自然语言处理-1

使用sklearn做自然语言处理-2

机器学习|八大步骤解决90%的NLP问题      

Python圈中的符号计算库-Sympy

Python中处理日期时间库的使用方法  

用chardect库解决网页乱码问题

使用 Pandas 更好地做数据科学(二)


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

上瘾

上瘾

[美] 尼尔·埃亚尔、[美] 瑞安·胡佛 / 钟莉婷、杨晓红 / 中信出版集团 / 2017-5 / 49.00元

——为什么我们会习惯性地点开某个App? ——这种使用习惯到底是如何养成的? ——为什么有些产品能让我们戒不掉,而其他的产品却不行? ——是否有什么秘诀能让用户对你的产品形成使用习惯,欲罢不能? 《上瘾》揭示了很多让用户形成使用习惯,甚至“上瘾”的互联网产品服务背后的基 本设计原理,告诉你怎样打造一款让用户欲罢不能的产品。作者根据自己多年的研究、咨询及实际经验,提出了新颖而......一起来看看 《上瘾》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换