groupby 分组统计

1.根据某些条件将数据分组

2.对每个组独立应用函数

3.将结果合并到一个数据结构中

Dataframe在行或列上分组,将一个函数应用到各个分组并产生一个新值,然后函数执行结果被合并到最终的结果对象中

  1. #分组
  2. import numpy as np
    import pandas as pd
    df = pd.DataFrame({'A':['foo','bar','foo','bar','foo','bar','foo','foo'],
  3. 'B':['one','one','two','three','two','two','one','three'],
  4. 'C':np.random.randn(8),
  5. 'D':np.random.randn(8)})
  6. print(df)
  7. print('------')
  8. print(df.groupby('A'),type(df.groupby('A')))
  9. #直接分组得到的是groupby对象,是一个中间数据,没有进行计算
  10. print(df.groupby('A').sum())#自动过滤字符串列
  11. print(df.groupby('A').mean())#平均值
  12. b = df.groupby(['A','B']).mean()
  13. print(b,type(b),'\n',b.columns)
  14. c = df.groupby(['A'])['D'].mean()#以A分组,取D列平均值
  15. print(c,type(c),'\n')

结果:
     A      B         C         D
0  foo    one  0.429615 -0.708782
1  bar    one  0.891751  1.140575
2  foo    two -0.261858 -0.516835
3  bar  three  1.310361  0.269657
4  foo    two  1.048076  1.374218
5  bar    two -0.410148  1.061132
6  foo    one -1.124137 -0.729367
7  foo  three  0.289513  0.892714
------
<pandas.core.groupby.DataFrameGroupBy object at 0x000000000FBACA58> <class 'pandas.core.groupby.DataFrameGroupBy'>
            C         D
A                     
bar  1.791963  2.471364
foo  0.381208  0.311947
            C         D
A                     
bar  0.597321  0.823788
foo  0.076242  0.062389
                  C         D
A   B                       
bar one    0.891751  1.140575
    three  1.310361  0.269657
    two   -0.410148  1.061132
foo one   -0.347261 -0.719074
    three  0.289513  0.892714
    two    0.393109  0.428691 <class 'pandas.core.frame.DataFrame'>
Index(['C', 'D'], dtype='object')
A
bar    0.823788
foo    0.062389
Name: D, dtype: float64 <class 'pandas.core.series.Series'>

  1. #分组 - 可迭代的对象
  2. df = pd.DataFrame({'X':['A','B','A','B'],'Y':[1,3,4,2]})
  3. print(df)
  4. print(df.groupby('X'),type(df.groupby('X')))
  5. print('-------')
  6. print(list(df.groupby('X')),'->可迭代对象,直接生成list\n')
  7. print(list(df.groupby('X'))[0],'->以元组的形式显示')
  8. for n,g in df.groupby('X'):
  9. print(n)
  10. print(g)
  11. print('###')
  12. print('--------')
  13. #n是组名,g是分组后的DataFrame
  14. print(df.groupby(['X']).get_group('A'),'\n')
  15. print(df.groupby(['X']).get_group('B'),'\n')
  16. #.get_group提取分组后的组
  17.  
  18. grouped = df.groupby(['X'])
  19. print(grouped.groups)
  20. print(grouped.groups['A'])#也可写 df.groupby('X').groups['A']
  21. print('-------')
  22. #.groups:将分组后的groups转化为dict
  23. #可以字典索引方法来查看groups里的元素
  24.  
  25. sz = grouped.size()
  26. print(sz,type(sz))
  27. #.size() 查看分组后的长度
  28. print('---------')
  29. df = pd.DataFrame({'A':['foo','bar','foo','bar','foo','bar','foo','foo'],
  30. 'B':['one','one','two','three','two','two','one','three'],
  31. 'C':np.random.randn(8),
  32. 'D':np.random.randn(8)})
  33. grouped = df.groupby(['A','B']).groups
  34. print(df)
  35. print(grouped)
  36. print(grouped['foo','three'])
  37.  
  38. dic=dict({'A':[1,2,3],
  39. 'B':[2,3,4]})
  40. print(dic,type(dic))

结果:
   X  Y
0  A  1
1  B  3
2  A  4
3  B  2
<pandas.core.groupby.DataFrameGroupBy object at 0x000000000F889F60> <class 'pandas.core.groupby.DataFrameGroupBy'>
-------
[('A',    X  Y
0  A  1
2  A  4), ('B',    X  Y
1  B  3
3  B  2)] ->可迭代对象,直接生成list

('A',    X  Y
0  A  1
2  A  4) ->以元组的形式显示
A
   X  Y
0  A  1
2  A  4
###
B
   X  Y
1  B  3
3  B  2
###
--------
   X  Y
0  A  1
2  A  4

X  Y
1  B  3
3  B  2

{'A': Int64Index([0, 2], dtype='int64'), 'B': Int64Index([1, 3], dtype='int64')}
Int64Index([0, 2], dtype='int64')
-------
X
A    2
B    2
dtype: int64 <class 'pandas.core.series.Series'>
---------
     A      B         C         D
0  foo    one -0.881923 -0.825102
1  bar    one -0.626412 -0.618638
2  foo    two -1.741248  1.557698
3  bar  three  1.076928  1.738265
4  foo    two -0.954103 -0.741415
5  bar    two  1.224841 -0.479472
6  foo    one  0.680046 -0.476137
7  foo  three -1.519952 -0.421738
{('bar', 'one'): Int64Index([1], dtype='int64'), ('bar', 'three'): Int64Index([3], dtype='int64'), ('bar', 'two'): Int64Index([5], dtype='int64'), ('foo', 'one'): Int64Index([0, 6], dtype='int64'), ('foo', 'three'): Int64Index([7], dtype='int64'), ('foo', 'two'): Int64Index([2, 4], dtype='int64')}
Int64Index([7], dtype='int64')
{'A': [1, 2, 3], 'B': [2, 3, 4]} <class 'dict'>

  1. #其他轴上分组
  2. df = pd.DataFrame({'data1':np.random.randn(2),
  3. 'data2':np.random.randn(2),
  4. 'key1':['a','b'],
  5. 'key2':['one','two']})
  6. print(df)
  7. print(df.dtypes)
  8. print('--------')
  9. for n,p in df.groupby(df.dtypes,axis=1):
  10. print(n)
  11. print(p)
  12. print('##')
  13. #按照值类型分组,分为2组

结果:
      data1     data2 key1 key2
0  0.813374  0.232957    a  one
1 -0.213256  1.393156    b  two
data1    float64
data2    float64
key1      object
key2      object
dtype: object
--------
float64
      data1     data2
0  0.813374  0.232957
1 -0.213256  1.393156
##
object
  key1 key2
0    a  one
1    b  two
##

  1. #通过字典或者Series分组
  2. df = pd.DataFrame(np.arange(16).reshape(4,4),
  3. columns = ['a','b','c','d'])
  4. print(df)
  5. print('-------')
  6.  
  7. mapping = {'a':'one','b':'one','c':'two','d':'two','e':'three'}
  8. print(mapping)
  9. by_column = df.groupby(mapping,axis = 1)
  10. print(by_column.sum())
  11. print('---------')
  12. #mapping中 a,b列对应为one,c,d列对应为two,以字典为分组
  13.  
  14. s=pd.Series(mapping)
  15. print(s)
  16. print(s.groupby(s).count())
  17. #s中,index = a,b对应的是one;c,d对应的是two,以Series来分组

结果:
    a   b   c   d
0   0   1   2   3
1   4   5   6   7
2   8   9  10  11
3  12  13  14  15
-------
{'a': 'one', 'b': 'one', 'c': 'two', 'd': 'two', 'e': 'three'}
   one  two
0    1    5
1    9   13
2   17   21
3   25   29
---------
a      one
b      one
c      two
d      two
e    three
dtype: object
one      2
three    1
two      2
dtype: int64

2018.03.28 python-pandas groupby使用的更多相关文章

  1. 2018.03.27 python pandas merge join 使用

    #2.16 合并 merge-join import numpy as np import pandas as pd df1 = pd.DataFrame({'key1':['k0','k1','k2 ...

  2. python pandas groupby

    转自 : https://blog.csdn.net/Leonis_v/article/details/51832916 pandas提供了一个灵活高效的groupby功能,它使你能以一种自然的方式对 ...

  3. 2018/03/28 每日一个Linux命令 之 mkdir/rmdir

    用于建立空文件夹和删除文件夹 -- 两命令重要参数 -p 递归建立/删除 -- 例如 mkdir -p demo1/demo2/demo3 建立demo3空文件夹,如果demo1/demo2没建立也建 ...

  4. Python pandas快速入门

    Python pandas快速入门2017年03月14日 17:17:52 青盏 阅读数:14292 标签: python numpy 数据分析 更多 个人分类: machine learning 来 ...

  5. 看到篇博文,用python pandas改写了下

    看到篇博文,https://blog.csdn.net/young2415/article/details/82795688 需求是需要统计部门礼品数量,自己简单绘制了个表格,如下: 大意是,每个部门 ...

  6. Python pandas & numpy 笔记

    记性不好,多记录些常用的东西,真·持续更新中::先列出一些常用的网址: 参考了的 莫烦python pandas DOC numpy DOC matplotlib 常用 习惯上我们如此导入: impo ...

  7. python pandas库——pivot使用心得

    python pandas库——pivot使用心得 2017年12月14日 17:07:06 阅读数:364 最近在做基于python的数据分析工作,引用第三方数据分析库——pandas(versio ...

  8. python中groupby函数详解(非常容易懂)

    一.groupby 能做什么? python中groupby函数主要的作用是进行数据的分组以及分组后地组内运算! 对于数据的分组和分组运算主要是指groupby函数的应用,具体函数的规则如下: df[ ...

  9. http://www.cnblogs.com/youring2/archive/2011/03/28/1997694.html

    http://www.cnblogs.com/youring2/archive/2011/03/28/1997694.html

随机推荐

  1. GDAL联合OpenCV进行图像处理

    作为一名图像处理方面的工程师,在面对大数据量的遥感影像时,往往会利用到强大的GDAL库,但是GDAL库却没有方面的算法函数进一步进行处理:同时我们看到Opencv库能提供强大的算法支持,却对大数据影像 ...

  2. Delphi 对象观察器

  3. web.xml中url-pattern中/和/*的区别(来自网络)

    其中/和/*的区别: < url-pattern > / </ url-pattern >   不会匹配到*.jsp,即:*.jsp不会进入spring的 Dispatcher ...

  4. ESP8266--WIFI热点扫描

    现在,通常,为了让手机连上一个WiFi热点,基本上都是打开手机设置里面的WiFi设置功能,然后会看到里面有个WiFi热点列表,然后选择你要的连接上. 基本上你只要打开手机连接WiFi功能,都会发现附近 ...

  5. 013:URL传参数

    URL传参数有两种方式: 1.采用在URL中使用变量的方式:在path的第一个参数中,使用'<参数名>'的方式可以传递参数,然后在对于的视图函数中也要写一个参数,并且视图函数中的参数名和U ...

  6. 【NOIP2016提高A组集训第4场11.1】平衡的子集

    题目 夏令营有N个人,每个人的力气为M(i).请大家从这N个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法? 分析 如果暴力枚举每个人被分到哪 ...

  7. org.springframework.web.servlet.view.ContentNegotiatingViewResolver

    restful服务中一个重要的特性就是一种资源可以有多种表现形式,在springmvc中可以使用ContentNegotiatingViewResolver这个视图解析器来实现这种方式. 描述资源的三 ...

  8. F12谷歌开发者工具preserve log

    谷歌开发者工具里面这个preserve log :保留请求日志,跳转页面的时候勾选上,可以看到跳转前的请求,也可适用于chrome开发者工具抓包的问题

  9. Vue的watch和computed方法的使用

    Vue的watch属性 Vue的watch属性可以用来监听data属性中数据的变化 <!DOCTYPE html> <html> <head> <meta c ...

  10. MySQL的视图和索引

    MySQL的视图 简单来说MySQL的视图就是对SELECT 命令的定义的一个快捷键,我们查询时会用到非常复杂的SELECT语句,而这个语句我们以后还会经常用到,我们可以经这个语句生产视图.视图是一个 ...