最近处理数据比较多,而分组统计经常用到,所以在此做个记录
# -*- coding: utf-8 -*-
"""
Created on Thu Jun 28 10:08:10 2018
@author: 鸣人吃土豆
"""
#导入数据
import pandas as pd
df = pd.read_excel("https://github.com/chris1610/pbpython/blob/master/data/sample-salesv3.xlsx?raw=True")
df["date"] = pd.to_datetime(df['date'])
df.head()
#统计'ext price'这个属性在每个月的累和(sum)值,resample 只有在index为date类型的时候才能用:
df.set_index('date').resample('M')['ext price'].sum()
#想知道每个用户每个月的sum值,那么就需要一个groupby了:
df.set_index('date').groupby('name')['ext price'].resample('M').sum()
df.groupby(['name',pd.Grouper(key='date',freq='M')])['ext price'].sum()
# 按照年度,且截止到12月最后一天统计ext price的sum值
df.groupby(['name',pd.Grouper(key='date',freq='A-DEC')])['ext price'].sum()
'''
从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'])
#你还可以针对不同的列使用不同的聚合函数:
df.agg({'ext price':['sum','mean'],'quantity':['sum','mean'],'unit price':['mean']})
#统计sku中,购买次数最多的产品编号
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]})
#输出的列按照某个顺序排列,可以使用collections的OrderedDict:
get_max = lambda x: x.value_counts(dropna=False).index[0]
get_max.__name__ = "most frequent"
import collections
agg_dict = {
'ext price': ['sum', 'mean'],
'quantity': ['sum', 'mean'],
'unit price': ['mean'],
'sku': [get_max]}
# 按照列名的长度排序。 OrderedDict的顺序是跟插入顺序一致的
df.agg(collections.OrderedDict(sorted(agg_dict.items(), key = lambda x: len(x[0]))))
下次介绍pivot_table