Pands分组统计函数

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

0、样例数据

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

1、分组groupby 

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

1)按列分组

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

[python]  view plain  copy
  1. group1 = df.groupby('key1')  
  2. group1  
  3. #[Out]# <pandas.core.groupby.DataFrameGroupBy object at 0x0000000009CA5780>  

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

[python]  view plain  copy
  1. group2 = df.groupby(['key1','key2'])  
  2. group2  
  3. #[Out]# <pandas.core.groupby.DataFrameGroupBy object at 0x0000000009CB4128>  

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

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

2)按分组统计

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

[python]  view plain  copy
  1. group1.size()  
  2. #[Out]# key1  
  3. #[Out]# a    3  
  4. #[Out]# b    2  
  5. #[Out]# dtype: int64  
  6. group1.sum()  
  7. #[Out]#          data1     data2  
  8. #[Out]# key1                      
  9. #[Out]# a     1.221499  1.053922  
  10. #[Out]# b    -2.001624 -1.019140  
  11. group2.size()  
  12. #[Out]# key1  key2  
  13. #[Out]# a     one     2  
  14. #[Out]#       two     1  
  15. #[Out]# b     one     1  
  16. #[Out]#       two     1  
  17. #[Out]# dtype: int64  
  18. group2.count()  
  19. #[Out]#            data1  data2  
  20. #[Out]# key1 key2                
  21. #[Out]# a    one       2      2  
  22. #[Out]#      two       1      1  
  23. #[Out]# b    one       1      1  
  24. #[Out]#      two       1      1  

3)应用agg()

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

[python]  view plain  copy
  1. group1['data1'].agg('mean')  
  2. #[Out]# key1  
  3. #[Out]# a    0.407166  
  4. #[Out]# b   -1.000812  
  5. #[Out]# Name: data1, dtype: float64  
  6. group1['data1'].agg(['mean','sum'])  
  7. #[Out]#           mean       sum  
  8. #[Out]# key1                      
  9. #[Out]# a     0.407166  1.221499  
  10. #[Out]# b    -1.000812 -2.001624  
  11. group1['data1','data2'].agg(['mean','sum'])  
  12. #[Out]#          data1               data2            
  13. #[Out]#           mean       sum      mean       sum  
  14. #[Out]# key1                                          
  15. #[Out]# a     0.407166  1.221499  0.351307  1.053922  
  16. #[Out]# b    -1.000812 -2.001624 -0.509570 -1.019140  

4)应用apply()

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

[python]  view plain  copy
  1. df.groupby('key1').apply(mean)  
  2. #[Out]#          data1     data2  
  3. #[Out]# key1                      
  4. #[Out]# a     0.407166  0.351307  
  5. #[Out]# b    -1.000812 -0.509570  
  6. df.groupby(['key1','key2']).apply(mean)  
  7. #[Out]#               data1     data2  
  8. #[Out]# key1 key2                      
  9. #[Out]# a    one   1.304883  0.828788  
  10. #[Out]#      two  -1.388267 -0.603653  
  11. #[Out]# b    one  -0.514400 -0.826736  
  12. #[Out]#      two  -1.487224 -0.192404  

2、透视表pivot_table 

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

1)分组统计

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

[python]  view plain  copy
  1. df  
  2. #[Out]#       data1     data2 key1 key2  
  3. #[Out]# 0  0.439801  1.582861    a  one  
  4. #[Out]# 1 -1.388267 -0.603653    a  two  
  5. #[Out]# 2 -0.514400 -0.826736    b  one  
  6. #[Out]# 3 -1.487224 -0.192404    b  two  
  7. #[Out]# 4  2.169966  0.074715    a  one  
  8. pd.pivot_table(df, index='key1', columns='key2')  
  9. #[Out]#          data1               data2            
  10. #[Out]# key2       one       two       one       two  
  11. #[Out]# key1                                          
  12. #[Out]# a     1.304883 -1.388267  0.828788 -0.603653  
  13. #[Out]# b    -0.514400 -1.487224 -0.826736 -0.192404  
  14. df.pivot_table(['data1'], index='key1',columns='key2')  
  15. #[Out]#          data1            
  16. #[Out]# key2       one       two  
  17. #[Out]# key1                      
  18. #[Out]# a     1.304883 -1.388267  
  19. #[Out]# b    -0.514400 -1.487224  

2)分项汇总

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

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

3、交叉表crosstab 

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

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

很幸运能够有这么多好用的方法,大大简化了数据分组分析的过程。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值