1、groupby函数:
#数据源长这样
df.head()
![20e4ea990b9637e8ad3b76b1bc39618b.png](https://i-blog.csdnimg.cn/blog_migrate/e7677374a6be312c94ffca976055b5c8.jpeg)
1、我们统计'ext price'这个属性在每个月的累和(sum)值,resample 只有在index为date类型的时候才能用:
df.set_index('date').resample('M')['ext price'].sum()
2、统计每个用户每个月的sum值:
df.set_index('date').groupby('name')['ext price'].resample("M").sum()
换一种写法,使用Grouper写得更加简洁:
df.groupby(['name', pd.Grouper(key='date', freq='M')])['ext price'].sum()
Grouper里的freq
可以方便的改成其他周期参数(resample也可以),比如:
df.groupby(['name', pd.Grouper(key='date', freq='A-DEC')])['ext price'].sum()
2、egg函数
从0.20.1开始,pandas引入了agg函数,它提供基于列的聚合操作。而groupby可以看做是基于行,或者说index的聚合操作。
从实现上看,groupby返回的是一个DataFrameGroupBy
结构,这个结构必须调用聚合函数(如sum)之后,才会得到结构为Series
的数据结果。
而agg是DataFrame的直接方法,返回的也是一个DataFrame。当然,很多功能用sum、mean等等也可以实现。但是agg更加简洁, 而且传给它的函数可以是字符串,也可以自定义,参数是column对应的子DataFrame。如:
df[["ext price", "quantity", "unit price"]].agg(['sum', 'mean'])
![ee8046a424067c5baccac811efeb0e3e.png](https://i-blog.csdnimg.cn/blog_migrate/8d530ca90531ac62a3ebfb89e749f0e2.jpeg)
你还可以针对不同的列使用不同的聚合函数:
df.agg({'ext price': ['sum', 'mean'], 'quantity': ['sum', 'mean'], 'unit price': ['mean']})
自定义函数你可以这么做:
# 这里的x是sku对应的column
get_max = lambda x: x.value_counts(dropna=False).index[0]
df.agg({'ext price': ['sum', 'mean'],
'quantity': ['sum', 'mean'],
'unit price': ['mean'],
'sku': [get_max]})
![af30dc97bee32a6adf6703945a315fa3.png](https://i-blog.csdnimg.cn/blog_migrate/9b6fb927b54a7f3ddebb140c399874ce.jpeg)