利用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

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

Pandas分组统计函数:groupby、pivot_table及crosstab相关推荐

  1. pandas分组统计 - groupby功能

    数据分组 分组统计 - groupby功能 ① 根据某些条件将数据拆分成组 ② 对每个组独立应用函数 ③ 将结果合并到一个数据结构中 Dataframe在行(axis=0)或列(axis=1)上进行分 ...

  2. pandas分组分析:GroupBy和pandas交叉分析:pivot_table/crosstab【学习记录】

    pandas分组分析 分组分析: 根据分组字段,将分析对象划分成不同的部分,以对比分析各组之间差异性的分析方法: 分组分析常用的统计指标是计数.求和.平均值等. grouby语法: groupby(b ...

  3. pandas 根据列名索引多列数据_Pandas 数据聚合与分组运算[groupby+apply]速查笔记

    利用Pandas将数据进行分组,并将各组进行聚合或自定义函数处理. Pandas中Groupby分组与聚合过程 导入模块 import pandas as pd 缩写 df表示Dataframe对象 ...

  4. pandas数据分组聚合——groupby()、aggregate()、apply()、transform()和filter()方法详解

    数据分组 数据分组就是根据一个或多个键(可以是函数.数组或df列名)将数据分成若干组,然后对分组后的数据分别进行汇总计算,并将汇总计算后的结果进行合并,被用作汇总计算的函数称为聚合函数.数据分组的具体 ...

  5. pandas数据处理实践四(时间序列date_range、数据分箱cut、分组技术GroupBy)

    时间序列: 关键函数 pandas.date_range(start = None,end = None,periods = None,freq = None,tz = None,normalize ...

  6. 【Pandas分组聚合】 groupby()、agg() 方法的使用

    Pandas分组聚合 创建一个dataframe结构 分组函数 groupby() 初识分组聚合 多重行索引分组聚合 对多列数据进行分组聚合 综合应用 聚合函数 agg(aggregate) 求 多列 ...

  7. pandas合并groupby_pandas数据聚合与分组运算——groupby方法

    简介 pandas中一类非常重要的操作是数据聚合与分组运算.通过groupby方法能够实现对数据集的拆分.统计.转换等操作,这个过程一气呵成. 在本文中,你将学到: 选取特定列分组: 对分组进行迭代: ...

  8. 【Pandas总结】第九节 Pandas_累计与分组 pd.groupby()

    文章目录 一.数据准备 二.累计值计算 2.1 df.describe() 2.2 常用统计值 三.分组 pd.groupby() 四.更多的使用方法`aggregate()`,`filter()`, ...

  9. pandas分组groupby(agg,transform),apply

    快速浏览 pandas简单介绍和本文说明 一.SAC过程 二.groupby函数 1. groupby分组函数的基本内容 单/多列分组 组容量与组数 组的遍历 level参数(用于多级索引)和axis ...

最新文章

  1. eclipse 变成中文
  2. 剑指offer二之替换空格
  3. 身份识别协议枚举工具ident-user-enum
  4. 独立成分分析 ( ICA ) 与主成分分析 ( PCA ) 的区别
  5. nginx http proxy 反向代理
  6. Xor sum HDU - 6955
  7. linux系统用w程序,Linux w命令
  8. 一步一步写算法(之单向链表)
  9. Android仿人人客户端(v5.7.1)——对从服务器端(网络)获取的图片进行本地双缓存处理(编码实现)...
  10. openstack上创建vm实例后,状态为ERROR问题解决
  11. Infosys:印度信息技术巨头公司
  12. 2018 iOS 面试法宝+绝密文件
  13. 【Godot】加载文件数据
  14. JAY和ZOOM,还有铁面人究竟是谁?
  15. base64编码的使用与解析
  16. 禅卡塔罗;追随它的指引,你会得到更多
  17. maven仓库已经存在jar包但是还是显示引入错误/失败
  18. 现有n个阶梯,你有两种上法,一次走一步或着走两步,问一共有多少种上法
  19. threejs知识点:1.模型分析
  20. python自动化接口测试excel脚本_python+ddt+unittest+excel+request实现接口自动化

热门文章

  1. 一方库,二方库,三方库指的是什么?
  2. 逐梦offer -- JVM篇
  3. Arduino小白学习记录:双色LED灯实验
  4. JMETER解决测试结果乱码问题
  5. 学习ES6(六)--函数 Lambda函数(=) 详解
  6. ffmpeg 设置关键帧
  7. http://localhost:8080/product/save找不到访问路径
  8. 3D-SKIPDENSESEG医学图像分割
  9. 零件三维缺陷检测相关基础知识
  10. Tableau中的表计算