文章目录
聚合
groupby
此处参考pandas的聚合操作: groupyby与agg
pandas提供基于行和列的聚合操作,groupby可理解为是基于行的,agg则是基于列的。
从实现上看,groupby返回的是一个DataFrameGroupBy结构,这个结构必须调用聚合函数(如sum)之后,才会得到结构为Series的数据结果。
而agg是DataFrame的直接方法,返回的也是一个DataFrame。当然,很多功能用sum、mean等等也可以实现。但是agg更加简洁, 而且传给它的函数可以是字符串,也可以自定义,参数是column对应的子DataFrame。
以下图数据为例column_map.head(8)
column_map.groupby(['work_order','work_station'])
表示按照前两个属性聚合。
这里会输出一个聚合类<pandas.core.groupby.DataFrameGroupBy object at 0x111242630>
我们再调用一个类的函数wo_ws_group = column_map.groupby(['work_order','work_station']) wo_ws_group.size()
新出现的列对应着每个工序工位下面有多少条记录
但是我们可以发现它的格式已经和我们平时使用的DataFrame不太一样了,我们可以使用下面的命令解决。wo_ws_group.size().reset_index()
查看相关分组有以下命令wo_ws_group.loc["0","11"]
查看工序工位分别为0和11的size。wo_ws_group.get_group('0','11').head(8)
查看工序工位分别为0和11的记录wo_ws_group['range_low'].idmin()
获取分组结果某一列的最小索引wo_ws_group['work_order'].apply(lambda x:2*x).head(8)
应用apply做二次处理
agg
如下数据data = pd.DataFrame([[2,11],[1,23],[5,11],[1.3,44],[5,111]],columns = ['price','quantity'],dtype = float)
data.agg({'price':['sum','mean'],'quantity':['sum']})
计算汇总或者均值
也可以自定义函数输入agg
我们用另外一个数据集看下groupby和agg联合使用
参考自详解pandas数据分析之groupby分组聚合(下)
数据字段说明
1、platform:用户使用的终端设备类型,分pc端、m端、ios端、android端。
2、sku:某款特点商品的唯一编号。
3、expose_num:商品sku的累计曝光数。
4、click_num:商品sku的累计点击数。
5、cart_num:商品sku的累计加购数。
6、collect_num:商品sku的累计收藏数。
7、order_num:商品sku的累计下单数。
统计不同sku的总曝光:
1.以字典格式传入要聚合的字段和聚合函数:df.groupby('sku').agg({'expose_num':'sum'})
2.将聚合的字段作为索引,聚合函数传入aggdf.groupby('sku')['expose_num'].agg(np.sum)
3.直接将函数名作为字符串传入aggdf.groupby('sku')['expose_num'].agg('sum')
4.直接使用sum()函数df.groupby('sku')['expose_num'].sum()
同时支持多字段分组和多字段聚合,这里不详细说明。