pandas groupby 详解

26人阅读 评论(0) 收藏 举报
分类:
  1. Name    Brand   Cloth   Count  
  2. girl    uniql   sweater 3  
  3. girl    etam    suit    1  
  4. girl    etam    pants   1  
  5. girl    lagogo  jacket  2  
  6. boy     pants   2  
  7. boy hailan  t-shirt 1  
  8. mother  hengyuanxiang   coat    2  
  9. mother  hengyuanxiang   sweater 1  
  10. mother      coat    1  
  11. father  hailan  t-shirt 2  
  12. father  hailan  sweater 1  
  13. father  hailan  pants   3  


本文数据源如上,Name:在家庭中的身份, Brand:衣服品牌, ClothType:衣服数量,Count:衣服数量

import pandas as pd

data=pd.read_excel('testdata.xlsx')
如果是csv文件:
import pandas as pd

data=pd.read_csv('testdata.csv',sep=',')
查看data的内容:
[python] view plain copy
  1. data  
  2. Out[1]:   
  3.       Name          Brand    Cloth  Count  
  4. 0     girl          uniql  sweater      3  
  5. 1     girl           etam     suit      1  
  6. 2     girl           etam    pants      1  
  7. 3     girl         lagogo   jacket      2  
  8. 4      boy            NaN    pants      2  
  9. 5      boy         hailan  t-shirt      1  
  10. 6   mother  hengyuanxiang     coat      2  
  11. 7   mother  hengyuanxiang  sweater      1  
  12. 8   mother            NaN     coat      1  
  13. 9   father         hailan  t-shirt      2  
  14. 10  father         hailan  sweater      1  
  15. 11  father         hailan    pants      3  


获取列名:
[python] view plain copy
  1. data.columns  
  2. Out[2]: Index(['Name''Brand''Cloth''Count'], dtype='object')  
  3. data.columns[0]  
  4. Out[2]: 'Name'  
  5. data.columns[1]  
  6. Out[3]: 'Brand'  
获取index:
[python] view plain copy
  1. data.index  
  2. Out[3]: RangeIndex(start=0, stop=12, step=1)  

从0开始,到12停,不包括12.所以一共有12行数据
获取values:
[python] view plain copy
  1. data.values  
  2. Out[4]:   
  3. array([['girl''uniql''sweater'3],  
  4.        ['girl''etam''suit'1],  
  5.        ['girl''etam''pants'1],  
  6.        ['girl''lagogo''jacket'2],  
  7.        ['boy', nan, 'pants'2],  
  8.        ['boy''hailan''t-shirt'1],  
  9.        ['mother''hengyuanxiang''coat'2],  
  10.        ['mother''hengyuanxiang''sweater'1],  
  11.        ['mother', nan, 'coat'1],  
  12.        ['father''hailan''t-shirt'2],  
  13.        ['father''hailan''sweater'1],  
  14.        ['father''hailan''pants'3]], dtype=object)  

获取某一行:
[python] view plain copy
  1. data.values[1]  
  2. Out[5]: array(['girl''etam''suit'1], dtype=object)  
获取某一格:
[python] view plain copy
  1. data.values[1][2]  
  2. Out[6]: 'suit'  

按某一列关键字分组:
[python] view plain copy
  1. gp=data.groupby('Brand')#写data.groupby(data['Brand'])也是一样的  
  2. gp  
  3. Out[10]: <pandas.core.groupby.DataFrameGroupBy object at 0x0000000008309B38>  
  4. type(gp)  
  5. Out[11]: pandas.core.groupby.DataFrameGroupBy  

gp是一个把dataframe groupby以后的对象,它实际上还没有进行任何计算,只是一个暂时存储的容器。
对这个暂时存储的容器进行计数,因为是按'Brand'分的组,:
[python] view plain copy
  1. gp.count()  
  2. Out[13]:   
  3.                Name  Cloth  Count  
  4. Brand                              
  5. etam              2      2      2  
  6. hailan            4      4      4  
  7. hengyuanxiang     2      2      2  
  8. lagogo            1      1      1  
  9. uniql             1      1      1  

看到按'Brand'分组后的这个结果,Name,Cloth,Count列在每种Brand所对应行的数字都一样,比如:2 2 2.可以理解为每种Brand各有多少行数据,把这个行数显示在所有列。
因为我们选择时是data.groupby(),而不是data['Count'].groupby()
p.s.:可以看到分组计数后的index是'Brand‘,这是因为分组是按'Brand’字段分的

[python] view plain copy
  1. gp.count().index  
  2. Out[14]: Index(['etam''hailan''hengyuanxiang''lagogo''uniql'], dtype='object', name='Brand')  

想知道每种Brand的衣服有多少人穿多少种,其实只看 Count列就行了。
比如father虽然有2件T-shirt,1件sweater,3件pants,还是算1个人穿3种hailan。boy有一件hailan的t-shirt,算1个人穿1种hailan。所以hailan对应4。 总之,count()函数可以理解为对Count列去重的和。
[python] view plain copy
  1. gp1=data['Count'].groupby(data['Brand'])  
  2. gp1.count() #和gp1.size()结果一样  
  3. Out[20]:   
  4. Brand  
  5. etam             2  
  6. hailan           4  
  7. hengyuanxiang    2  
  8. lagogo           1  
  9. uniql            1  
  10. Name: Count, dtype: int64  

想求某品牌被人均拥有的件数的平均值:
比如hailan就是father的2件T恤,1件毛衣,3条裤子,还有boy的1件T恤。 (2+1+3+1)/4=1.75。 分母4可以理解为刚才所说的 gp1.count() :每种Brand的衣服有多少人穿多少种
比如hengyuanxiang就是mother的2件大衣,1件毛衣 ,(2+1)/2=1.5
[python] view plain copy
  1. gp1.mean()  
  2. Out[21]:   
  3. Brand  
  4. etam             1.00  
  5. hailan           1.75  
  6. hengyuanxiang    1.50  
  7. lagogo           2.00  
  8. uniql            3.00  
  9. Name: Count, dtype: float64  
说明:type(gp1.mean())  是 Series类型。之所以index叫'Brand',是因为原datafram是按'Brand' groupby的


想求某品牌被每人拥有的件数:(与“”想知道每种Brand的衣服有多少人穿多少种“ .count( )算法的区别在于 不去重)
在Count列上加和
[python] view plain copy
  1. gp1.agg(sum) #就是 data['Count'].groupby(data['Brand']).agg(sum) , agg里也可以写'sum',与不加单引号等效  
  2. Out[5]:   
  3. Brand  
  4. etam             2  
  5. hailan           7  
  6. hengyuanxiang    3  
  7. lagogo           2  
  8. uniql            3  
  9. Name: Count, dtype: int64  

综上所述可以观察出,gp1.mean()操作的结果等于 gp1.agg(sum)/gp1.count()

遍历分组:
[python] view plain copy
  1. for name,group in data.groupby(data['Brand']):  
  2.     print(name)  
  3.     print(group)  
  4.       
  5. etam  
  6.    Name Brand  Cloth  Count  
  7. 1  girl  etam   suit      1  
  8. 2  girl  etam  pants      1  
  9. hailan  
  10.       Name   Brand    Cloth  Count  
  11. 5      boy  hailan  t-shirt      1  
  12. 9   father  hailan  t-shirt      2  
  13. 10  father  hailan  sweater      1  
  14. 11  father  hailan    pants      3  
  15. hengyuanxiang  
  16.      Name          Brand    Cloth  Count  
  17. 6  mother  hengyuanxiang     coat      2  
  18. 7  mother  hengyuanxiang  sweater      1  
  19. lagogo  
  20.    Name   Brand   Cloth  Count  
  21. 3  girl  lagogo  jacket      2  
  22. uniql  
  23.    Name  Brand    Cloth  Count  
  24. 0  girl  uniql  sweater      3  
由上可以看出,brand为NaN 的衣服并没有被分组,自动忽略不计了。


对于由DataFrame产生的GroupBy对象,如果用一个(单个字符串)或一组(字符串数组)列名对其进行索引,就能实现选取部分列进行聚合的目的,即:

写法一:

[python] view plain copy
  1. data.groupby('Brand')['Count'].sum()#等价于data.groupby('Brand')['Count'].agg(sum),等价于data.groupby('Brand')['Count'].agg('sum')#等价于data.groupby('Brand').agg('sum')['Count'],等价于data.groupby('Brand').agg(sum)['Count'],等价于data.groupby('Brand').sum()['Count']  
  2. Out[13]:   
  3. Brand  
  4. etam             2  
  5. hailan           7  
  6. hengyuanxiang    3  
  7. lagogo           2  
  8. uniql            3  
  9. Name: Count, dtype: int64  

这和写法二:

[python] view plain copy
  1. data['Count'].groupby(data['Brand']).sum()  
  2. Out[19]:   
  3. Brand  
  4. etam             2  
  5. hailan           7  
  6. hengyuanxiang    3  
  7. lagogo           2  
  8. uniql            3  
  9. Name: Count, dtype: int64  

是等效的

注意写法一里面的'Brand'不用必须写成(当然也可以写成)data['Brand'],是因为data.groupby()由于是对data这个dataframe调用的方法,所以能识别出data的字段'Brand'。但是写法二是对data['Count'] 这个Series对象调用的groupby,不认识'Brand',只认识data['Brand'],如果写法二还写成.groupby('Brand')就会报错。


双索引分组:

想知道每人拥有每种品牌的衣服多少种类型(类型就是Cloth字段,写成ClothType大家更容易理解哈):

[python] view plain copy
  1. data.groupby(['Name','Brand'])['Count'].count() #和写.size( )效果一样  
  2. Out[31]:   
  3. Name    Brand          
  4. boy     hailan           1  
  5. father  hailan           3  
  6. girl    etam             2  
  7.         lagogo           1  
  8.         uniql            1  
  9. mother  hengyuanxiang    2  
  10. Name: Count, dtype: int64  

从结果可以看出,对boy拥有的没Brand的一条裤子,和mother没牌子的一件大衣,都自动忽略不计了。
查看评论

Pandas+groupby用法讲解

import pandas as pd import numpy as np#导入数据 type_specified={"trip_id":"object","bikeid":"object","fr...
  • zhangxiaojiakele
  • zhangxiaojiakele
  • 2017-10-10 22:41:45
  • 4981

pandas中groupby和pivot_table(数据透视表)

pivot_table(数据透视表)可以看做是一种高级的groupby功能,下面贴两段代码比较一下: df=pd.read_csv('2016_sale.csv') a=pd.pivot_ta...
  • hal_sakai
  • hal_sakai
  • 2016-12-16 15:31:33
  • 2576

pandas - groupby, agg分组统计

参考文献 http://jingyan.baidu.com/article/adc8151358a781f723bf73c4.html http://jingyan.baidu.com/articl...
  • ZK_J1994
  • ZK_J1994
  • 2017-08-21 22:47:27
  • 1574

Pandas GroupBy对象 索引与迭代

import pandas as pd df = pd.DataFrame({'性别' : ['男', '女', '男', '女', '男'...
  • claroja
  • claroja
  • 2017-06-08 11:42:10
  • 1355

pandas聚合和分组运算之groupby

pandas提供了一个灵活高效的groupby功能,它使你能以一种自然的方式对数据集进行切片、切块、摘要等操作。根据一个或多个键(可以是函数、数组或DataFrame列名)拆分pandas对象。计算分...
  • Leonis_v
  • Leonis_v
  • 2016-07-05 16:55:48
  • 68774

pandas多表操作,groupby,时间操作

多表操作 merge合并 pandas.merge可根据一个或多个键将不同DataFrame中的行合并起来 pd.merge(left, right)# 默认merge会将重叠列的列名当做键,即ho...
  • zhili8866
  • zhili8866
  • 2017-03-30 10:56:52
  • 3135

Pandas groupby apply agg 区别 运行自定义函数

agg 方法将一个函数使用在一个数列上,然后返回一个标量的值。也就是说agg每次传入的是一列数据,对其聚合后返回标量。 对一列使用三个函数: 对不同列使用不同函数 apply 是一个更一...
  • qq_16234613
  • qq_16234613
  • 2017-10-15 23:09:14
  • 1842

python/pandas数据挖掘(十四)-groupby,聚合,分组级运算

groupby,聚合,分组级运算,python 数据分析
  • youngbit007
  • youngbit007
  • 2017-01-09 14:23:39
  • 47656

理解pandas的groupby().apply()

如何理解《利用Python进行数据分析》第2章1880-2010年间全美婴儿姓名例子中的names.groupby(['year', 'sex']).apply(add_prop)...
  • spiral1221
  • spiral1221
  • 2017-07-26 16:13:53
  • 2099

pandas函数应用篇之GroupBy.apply

讲解pandas.core.groupby.GroupBy.apply的一个运用实例,经常结合numpy库和隐函数lamda来使用,官网API看得云里雾里的。如果对博客的数据感兴趣可以在第一届.腾讯社...
  • u011523796
  • u011523796
  • 2017-07-04 22:51:12
  • 3779
    个人资料
    持之以恒
    等级:
    访问量: 12万+
    积分: 4724
    排名: 7694
    最新评论