之前分享过一篇 使用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里的datetime类,这样可以使用一些高级用法
#df.date = pd.to_datetime(df.date) 该写法与下面一行作用等同 df["date"] = pd.to_datetime(df['date']) df.head()
将date转化为dataframe中的index,使用df.set_index(colname),这里我们
df.set_index('date')
#注意df.set_index('date', inplace=True)的区别
我们统计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'])
df.agg-针对不同的列使用不同的聚合函数
df.agg({'ext price': ['sum', 'mean'],
'quantity': ['sum', 'mean'],
'unit price': ['mean']})
往期文章
深度学习之 图解LSTM
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- [python][科学计算][numpy]使用指南
- [python][科学计算][matplotlib]使用指南
- [python][科学计算][pandas]使用指南
- 使用 Python 和 VTK 库进行科学可视化
- 如何成为数据科学家?数据科学业界大牛们倾囊相授
- 阿里科学家 | 蚂蚁AI首席科学家漆远: 用AI和爱, 让我们遇见更美好的未来
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
网站转换率优化之道
[美] Khalid Saleh、[美] Ayat Shukairy / 顾 毅 / 人民邮电出版社 / 2012-4 / 45.00元
内容简介: 怎样才能将访问者转化为顾客? 本书提供了一些切实可行的建议,比如如何说服访问者作出购买决定,如何避免用户因信息过量或导航繁琐而离开网站等。不论你是在设计或营销大型电子商务网站,还是在管理中小型在线业务,都可以从本书学会怎样使用市场营销原则、设计方法、可用性原则和分析数据来持续提升网站的转换率。 作者帮助过众多公司吸引在线顾客,有着丰富的实战经验,在书中细致讨论了从访问......一起来看看 《网站转换率优化之道》 这本书的介绍吧!