之前分享过一篇 使用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和爱, 让我们遇见更美好的未来
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
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》 这本书的介绍吧!