第九章 数据聚合与分组计算

一、Groupby分组

0.准备

df=pd.DataFrame({'key1':list('aabba'),
                'key2':['one','two','one','two','one'],
		'data1':np.random.randn(5),
people = pd.DataFrame(np.random.randn(5,5),
                      columns = ['a','b','c','d','e'],
                      index = ['Joe','Steve','Wes','Jim','Travis'])


'data2':np.random.randn(5)})

1,X.groupby([Y,Z]).sum() 分组依据都在【】里面,YZ为长度相当的数组即可2,Groupby函数:sum,mean,size(计每组个数)3.分组迭代
for(n1,n2),group in df.groupby(['key1','key2'])
for name,group in df.groupby('key1'):

4.列分组聚合
a=dict(list(df.groupby(df.dtypes,axis=1)))

5.等价代码
a=df.groupby('key1')['data1'].sum()
b=df['data1'].groupby(df['key1']).sum()

6.用字典分组
people = pd.DataFrame(np.random.randn(5,5),
                      columns = ['a','b','c','d','e'],
                      index = ['Joe','Steve','Wes','Jim','Travis'])
mapping = {'a':'red','b':'red','c':'blue','d':'blue','e':'red','f':'orange'}


a=people.groupby(mapping,axis=1).sum()

7.用函数分组
a=people.groupby([len,mapping]).sum()

8.用索引分组
b=a.groupby(level=1).count()
c=a.groupby(level=1).size()

9.groupby的函数
sum,mean,

size(返回series),count(返回dataframe),使用level,0为最外层


二、数据聚合(agg)

1.用自定义函数聚合(如何自定义

def peak(arr):
    return arr.max()-arr.min()

a=df.groupby('key1').agg(peak)

2.用于全部列的多个函数

a=df.groupby('key1').agg(peak,'mean','count')


可对其命名,传入由(name,func)组成的元组

这样得到的dataframe函数列名就改变了

fun=[('a',peak),('ha','mean'),('ad','count'),('ap','std')]

a=df.groupby('key1').agg(fun)

3.用于不同列的不同函数

mun={'data1':['mean',peak,'size','sum'],
     'data2':['count',peak,'std','var']}
a=df.groupby('key1').agg(mun)

同样可以命名

mun={'data1':[('a','mean'),('b',peak)],
     'data2':[('c','count'),('d',peak)]}
a=df.groupby('key1').agg(mun)


三、其他分组计算方法

1.transform

不改变元数据个数,同样分组,但是会返回值到元数据结构每个位置上

2.apply

应用更广泛,条件更宽泛,一般化的分组计算方法

def top(x,n=5,column='tip_pct'):
	return x.sort_index(by=column)[-n:]

a=tips.groupby(['smoker','sex']).apply(top,column='tip',n=2)


禁止分组键:

a=tips.groupby(['smoker','sex'],group_keys=False).apply(top,column='tip',n=2)




注意:区分agg,transform,apply

agg 用于自定义 聚合函数

transform 会保持原数据结构,如5*4结构,算完还是5*4结构,而agg可能就是5*2结构了

apply 更宽泛的自自己构造函数



四,透视表与交叉表

1.x.pivot_table()

tips=pd.read_csv('ch08/tips.csv')
a=tips.pivot_table('size',index=['sex','time','smoker'],columns='day',margins=True,
                   aggfunc='sum',fill_value='hah')

各个参数:value 填充值

index 行索引

columns 列索引

margins 添加all的行和列

aggfunc 函数,默认为‘mean’

fill_value 填充缺失值

2.pd.crosstab()

用于统计频数

data=pd.DataFrame({'sample':[1,2,3,4,5,6,7,8,9,10],
                  'gender':['female','male','female','male','male','male','female','female','male','female'],
                  'handedness':['right','left','right','right','left','right','right','left','right','right']})

a=pd.crosstab([data['gender'],data['sample']],data['handedness'],margins=True)


3.数据规整化中的x.pivot() 也差不多,只是放进去的是原数据


都是将宽格式转化为长格式


















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值