Pandas分组统计函数:groupby、pivot_table及crosstab

利用python的pandas库进行数据分组分析十分便捷,其中应用最多的方法包括:groupby、pivot_table及crosstab,以下分别进行介绍。

0、样例数据

df = DataFrame({'key1':['a','a','b','b','a'],'key2':['one','two','one','two','one'],'data1':np.random.randn(5),'data2':np.random.randn(5)})
df
#[Out]#       data1     data2 key1 key2
#[Out]# 0  0.439801  1.582861    a  one
#[Out]# 1 -1.388267 -0.603653    a  two
#[Out]# 2 -0.514400 -0.826736    b  one
#[Out]# 3 -1.487224 -0.192404    b  two
#[Out]# 4  2.169966  0.074715    a  one

1、分组groupby 

Pandas中最为常用和有效的分组函数。

1)按列分组

注意以下使用groupby()函数生成的group1是一个中间分组变量,为GroupBy类型。

group1 = df.groupby('key1')
group1
#[Out]# <pandas.core.groupby.DataFrameGroupBy object at 0x0000000009CA5780>

既可依据单个列名’key1’进行为分组,也可依据多个列名['key1','key2']进行分组。

group2 = df.groupby(['key1','key2'])
group2
#[Out]# <pandas.core.groupby.DataFrameGroupBy object at 0x0000000009CB4128>

使用推导式[x for x in group1]可显示分组内容。

[x for x in group1]
#[Out]# [('a',       data1     data2 key1 key2
#[Out]#   0  0.439801  1.582861    a  one
#[Out]#   1 -1.388267 -0.603653    a  two
#[Out]#   4  2.169966  0.074715    a  one), 
#[Out]#  ('b',       data1     data2 key1 key2
#[Out]#   2 -0.514400 -0.826736    b  one
#[Out]#   3 -1.487224 -0.192404    b  two)]

2)按分组统计

在分组group1、group2上应用size()、sum()、count()等统计函数,能分别统计分组数量、不同列的分组和、不同列的分组数量。

group1.size()
#[Out]# key1
#[Out]# a    3
#[Out]# b    2
#[Out]# dtype: int64
group1.sum()
#[Out]#          data1     data2
#[Out]# key1                    
#[Out]# a     1.221499  1.053922
#[Out]# b    -2.001624 -1.019140
group2.size()
#[Out]# key1  key2
#[Out]# a     one     2
#[Out]#       two     1
#[Out]# b     one     1
#[Out]#       two     1
#[Out]# dtype: int64
group2.count()
#[Out]#            data1  data2
#[Out]# key1 key2              
#[Out]# a    one       2      2
#[Out]#      two       1      1
#[Out]# b    one       1      1
#[Out]#      two       1      1

3)应用agg()

对于分组的某一列或者多个列,应用agg(func)可以对分组后的数据应用func函数。例如:用group1['data1'].agg('mean')对分组后的’data1’列求均值。当然也可以推广到同时作用于多个列和使用多个函数上。

group1['data1'].agg('mean')
#[Out]# key1
#[Out]# a    0.407166
#[Out]# b   -1.000812
#[Out]# Name: data1, dtype: float64
group1['data1'].agg(['mean','sum'])
#[Out]#           mean       sum
#[Out]# key1                    
#[Out]# a     0.407166  1.221499
#[Out]# b    -1.000812 -2.001624
group1['data1','data2'].agg(['mean','sum'])
#[Out]#          data1               data2          
#[Out]#           mean       sum      mean       sum
#[Out]# key1                                        
#[Out]# a     0.407166  1.221499  0.351307  1.053922
#[Out]# b    -1.000812 -2.001624 -0.509570 -1.019140

4)应用apply()

apply()不同于agg()的地方在于:前者应用于dataframe的各个列,后者仅作用于指定的列。

df.groupby('key1').apply(mean)
#[Out]#          data1     data2
#[Out]# key1                    
#[Out]# a     0.407166  0.351307
#[Out]# b    -1.000812 -0.509570
df.groupby(['key1','key2']).apply(mean)
#[Out]#               data1     data2
#[Out]# key1 key2                    
#[Out]# a    one   1.304883  0.828788
#[Out]#      two  -1.388267 -0.603653
#[Out]# b    one  -0.514400 -0.826736
#[Out]#      two  -1.487224 -0.192404

2、透视表pivot_table 

可以产生类似于excel数据透视表的结果,相当的直观。

1)分组统计

其中参数index指定“行”键,columns指定“列”键。

df
#[Out]#       data1     data2 key1 key2
#[Out]# 0  0.439801  1.582861    a  one
#[Out]# 1 -1.388267 -0.603653    a  two
#[Out]# 2 -0.514400 -0.826736    b  one
#[Out]# 3 -1.487224 -0.192404    b  two
#[Out]# 4  2.169966  0.074715    a  one
pd.pivot_table(df, index='key1', columns='key2')
#[Out]#          data1               data2          
#[Out]# key2       one       two       one       two
#[Out]# key1                                        
#[Out]# a     1.304883 -1.388267  0.828788 -0.603653
#[Out]# b    -0.514400 -1.487224 -0.826736 -0.192404
df.pivot_table(['data1'], index='key1',columns='key2')
#[Out]#          data1          
#[Out]# key2       one       two
#[Out]# key1                    
#[Out]# a     1.304883 -1.388267
#[Out]# b    -0.514400 -1.487224

2)分项汇总

如果将参数margins设置为True,则可以得到分项总计数据。

df.pivot_table(index='key1',columns='key2', margins=True)
#[Out]#          data1                         data2                    
#[Out]# key2       one       two       All       one       two       All
#[Out]# key1                                                            
#[Out]# a     1.304883 -1.388267  0.407166  0.828788 -0.603653  0.351307
#[Out]# b    -0.514400 -1.487224 -1.000812 -0.826736 -0.192404 -0.509570
#[Out]# All   0.698455 -1.437746 -0.156025  0.276947 -0.398029  0.006956

3、交叉表crosstab 

可以按照指定的行和列统计分组频数,用起来非常方便;当然同样的功能也可采用groupby实现。

pd.crosstab(df.key1,df.key2, margins=True)
#[Out]# key2  one  two  All
#[Out]# key1               
#[Out]# a       2    1    3
#[Out]# b       1    1    2
#[Out]# All     3    2    5

很幸运能够有这么多好用的方法,大大简化了数据分组分析的过程。





评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值