分组聚合–主要有以下知识点:
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版权协议,转载请附上原文出处链接和本声明。