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

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

之前分享过一篇 使用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 更好地做数据科学(二)


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

查看所有标签

猜你喜欢:

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

ActionScript 3.0 Cookbook

ActionScript 3.0 Cookbook

Joey Lott、Darron Schall、Keith Peters / Adobe Dev Library / 2006-10-11 / GBP 28.50

Well before Ajax and Microsoft's Windows Presentation Foundation hit the scene, Macromedia offered the first method for building web pages with the responsiveness and functionality of desktop programs......一起来看看 《ActionScript 3.0 Cookbook》 这本书的介绍吧!

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

Base64 编码/解码

URL 编码/解码
URL 编码/解码

URL 编码/解码

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

在线 XML 格式化压缩工具