07-17 分组聚合--基本的统计方法

分组聚合–主要有以下知识点:

1、描述性统计知识 ,如min() 最小值,max() 最大值,median() --中位数,mead() 均值,

quantitle 分位数,quantitle(0.1,0,2,0.5,0.8)分别表示 十分位数,二十分位数,

五十分位数--又叫中位数,八十分位数等

2、分组运算方法--groupby ,类似于SQL中的groupby方法

3、聚合方法--egg,apply和transfrom等

实例如下:

os.chdir('数据存储路径')
sales=pd.read_csv('app.csv',dtype=['year':float])

—将year这一列下的数据读取成浮点型数据
选取想要的列名(因为数据很多很多时我们选取想要的变量)

import pandas as pd
import numpy as np
import os

list=[['2000','89','24','34','78','LOL','900'],
      ['2001','44','34','343','34','LOL','487'],
      ['2008','22','333','34','66','CS','868'],
     ['2010','322','434','342','676','CS','988'],
     ['2018','356','445','666','777','VB','777']]


list
[[‘2000’, ‘89’, ‘24’, ‘34’, ‘78’, ‘LOL’, ‘900’],
[‘2001’, ‘44’, ‘34’, ‘343’, ‘34’, ‘LOL’, ‘487’],
[‘2008’, ‘22’, ‘333’, ‘34’, ‘66’, ‘CS’, ‘868’],
[‘2010’, ‘322’, ‘434’, ‘342’, ‘676’, ‘CS’, ‘988’],
[‘2018’, ‘356’, ‘445’, ‘666’, ‘777’, ‘VB’, ‘777’]]

os.chdir('C:\data')
sales=pd.DataFrame(list,columns=['year', 'n_sale', 's_sale',
 'china_sale', 'e_sale', 'name', 'money'])

sales

year	n_sale	s_sale	china_sale	e_sale	name	money
0	2000	89	24	34	78	LOL	900
1	2001	44	34	343	34	LOL	487
2	2008	22	333	34	66	CS	868
3	2010	322	434	342	676	CS	988
4	2018	356	445	666	777	VB	777
选取想要的数据列
var_name=['year','s_sale','china_sale','money']
#

求均值/最值/等

np.min(sales[var_name],axis=0)
year          2000.0
s_sale          24.0
china_sale      34.0
money          487.0
dtype: float64

sales[var_name].cumsum(axis=0)
选取的数据沿着列想 累加

year	s_sale	china_sale	money
0	2000	24	34	900
1	20002001	2434	34343	900487
2	200020012008	2434333	3434334	900487868
3	2000200120082010	2434333434	3434334342	900487868988
4	20002001200820102018	2434333434445	3434334342666	900487868988777

求百分数(后边注明百分之几数)

sales[var_name].quantile([0.2,0.3,0.5,0.7])

所选列的特征值计算

sales.[var_name].describe() 

year	s_sale	china_sale	money
count	5	5	5	5
unique	5	5	4	5
top	2001	445	34	487
freq	1	1	2	1

字符型 变量的统计

sales.[var_name].describe(include=['object'])


year	s_sale	china_sale	money
count	5	5	5	5
unique	5	5	4	5
top	2001	445	34	487
freq	1	1	2	1

分类汇总

按照 ‘年’ 进行分类

groupde=sales.groupby('year')

type(groupde)--数据类型的判断

pandas.core.groupby.generic.DataFrameGroupBy
groupde---分组对象的内存地址

<pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000000006D91A08>

每一个条件下的样本个数的统计

groupde.count()
n_sale	s_sale	china_sale	e_sale	name	money
year						
2000	1	1	1	1	1	1
2001	1	1	1	1	1	1
2008	1	1	1	1	1	1
2010	1	1	1	1	1	1
2018	1	1	1	1	1	1
groupde.max()
n_sale	s_sale	china_sale	e_sale	name	money
year						
2000	89	24	34	78	LOL	900
2001	44	34	343	34	LOL	487
2008	22	333	34	66	CS	868
2010	322	434	342	676	CS	988
2018	356	445	666	777	VB	777
groupde.size()
分类下的样本统计

year
2000    1
2001    1
2008    1
2010    1
2018    1
dtype: int64

对某一个具体条件(如2001年)下的样本的标记
如:2001年有20个样本,从0标记到19

groupde.cumcount()
0    0
1    0
2    0
3    0
4    0
dtype: int64

通过两个列进行分组

groupde2=sales[names].groupby(by=['name','year'])

groupde2
<pandas.core.groupby.generic.DataFrameGroupBy object
 at 0x0000000008D87808>

groupde2.mean() ---对分组后的每一个变量求均值

对于分组所得求得中位数,然后再进行层次化索引查找

groupde2.median().loc[([2001,2008],'LOL'),:]

聚合函数-aggregate/apply

agg- agg方法能够对分组对象进行相同的聚合,还可以选择不同的聚合方法
apply--可以进行聚合计算,还可以进行按行计算
transform--返回与数据同样长度的行,无法进行聚合
建议---今后更多使用apply或者 agg
names=['n_sale','china_sale','name']--选取需要的列
groupd=sales[names].groupby('name') name 分组
groupd.agg([np.mean,np.sum]).head(10)-对分组后的进行求均值,求总合,且只查看前十行

groupd.agg([np.mean,np.sum]).loc[[2001,2008],('n-sales',['mean','sum'])]

-----对列的层次化引用

注意: 行索引  列索引  一起时用‘,’ 逗号分开,一般逗号前为行索引,之后为列索引

对不同的变量输出不同统计量

groupde.agg({'n_sales':np.mean,'s_sale':np.sum})

对不同的变量求多个不同的统计值

groupde.agg({'n_sales':[np.mean,np.median],'s_sale':[np.sum,np.mean})

还可以计算自定义函数

def doublesum(data):
	s=data.sum*10
	return s
	
groupd.agg({'s_sale':doublesum})

对某一个变量求和后2 == 先求和再2

如:
sales.['year'].sum()*2 == 

sales.agg({'year':doublesum}) 

apply

apply函数比agg函数,可以设定轴向 axis=0/1

sales.apply(np.sum,axis=0)

year          20002001200820102018
n_sale                894422322356
s_sale               2434333434445
china_sale           3434334342666
e_sale                783466676777
name                  LOLLOLCSCSVB
money              900487868988777
dtype: object

第二列-第三列

sales[names].apply(lambda x: x[1]-x[2],axis=1)

transform函数

transform函数常用语对数据中每一个元素进行操作,不能对行进行操作,队列可以操作,但是不常用;
如:

sales.transform(lambda x: x*2)---对每一个元素进行操作

year	n_sale	s_sale	china_sale	e_sale	name	money
0	20002000	8989	2424	3434	7878	LOLLOL	900900
1	20012001	4444	3434	343343	3434	LOLLOL	487487
2	20082008	2222	333333	3434	6666	CSCS	868868
3	20102010	322322	434434	342342	676676	CSCS	988988
4	20182018	356356	445445	666666	777777	VBVB	777777

对列进行操作

对所选列的每一个元素进行操作

sales[var_name].transform(lambda x: x*2)

版权声明:本文为weixin_46400833原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。