pandas groupby 详解

 

https://blog.csdn.net/u011462357/article/details/78377411

 
  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的内容:
 
 
  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

 

获取列名:
 
 
  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:

 
 
  1. data.index

  2. Out[3]: RangeIndex(start=0, stop=12, step=1)


从0开始,到12停,不包括12.所以一共有12行数据

 
获取values:
 
 
  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)


获取某一行:

 
 
  1. data.values[1]

  2. Out[5]: array(['girl', 'etam', 'suit', 1], dtype=object)

 

获取某一格:

 
 
  1. data.values[1][2]

  2. Out[6]: 'suit'


按某一列关键字分组:

 
 
  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'分的组,:
 
 
 
  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’字段分的

 

 
  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列去重的和。

 
  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

 
  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列上加和

 
  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()

 

遍历分组:

 

 
  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对象,如果用一个(单个字符串)或一组(字符串数组)列名对其进行索引,就能实现选取部分列进行聚合的目的,即:

写法一:

 

 
  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

 

 

这和写法二:

 

 
  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大家更容易理解哈):

 

 
  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没牌子的一件大衣,都自动忽略不计了。

 

 

 

最后,感谢http://blog.csdn.net/leonis_v/article/details/51832916的分享

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值