python的分组统计之谜(一)

最近处理数据比较多,而分组统计经常用到,所以在此做个记录

# -*- 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

    原文作者:鸣人吃土豆
    原文地址: https://www.jianshu.com/p/735157207ae1
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞