《对比Excel,轻松学习Python数据分析》读书笔记------数据分组与数据透视表

10 数据分组与数据透视表

10.1 数据分组

数据分组是根据一个键(key)(df列名/函数/数组)将数据分成若干组,然后分别对各组里的数据进行汇总计算,计算完成后再将结果合并到原来的数据表中。

用来汇总计算的函数常称为聚合函数。

在这里插入图片描述

Excel

在Excel中,进行数据分组前需要先对 键 进行升序/降序排序。这样的目的是使相同的键值紧靠在一起。

键值排完序后,选中待分组区域,依次点击"数据">“分级显示”>“分类汇总”,调出分类汇总界面:

在这里插入图片描述

"分类字段"即分组依据的键(列),"汇总方式"即选择特定的聚合函数对各组数据进行计算(平均数,最值,方差等),

"汇总项"即对哪一列数据进行汇总计算。

在这里插入图片描述

Python

主要使用groupby()方法。与sql语法中的GROUPBY类似

df.group(by=None,
         axis: 'Axis' = 0,
         level: 'Level | None' = None,
         as_index: 'bool' = True,
         dropna: 'bool' = True)
  • by设置分组键(依据)。可以是列名列表,字典(key为列名,value为列值),函数等。

  • axis设置分组单位。0代表行。1代表列。

  • level设置按照组合索引的第几层进行分组,从0开始

  • as_index设置是否将分组键(依据)作为索引。默认True.

  • sort设置是否按照分组键(依据)进行排序

  • dropna设置是否忽略空值键。

  • groupby方法仅仅只是将数据分组(返回DataFrameGroupBy对象),要进行计算,需要在此基础上另外调用数值计算相关的方法(聚合函数)。

10.1.1 按列分组 单聚合函数
print(df)
"""
   班级  姓名   语文  数学  英语
0  1班  张三  100  98  89
1  1班  李三   92  78  89
2  1班  赵四   67  88  56
3  2班  张四   89  77  78
4  2班  赵三   87  89  89
5  2班  刘五   99  68  69
6  3班  李四   79  94  92
7  3班  刘六   88  83  94
8  3班  陈七   85  78  79
"""

a=df.groupby("班级")
print(type(a))
# <class 'pandas.core.groupby.generic.DataFrameGroupBy'>
print(a["语文"].mean())
"""
班级
1班    86.333333
2班    91.666667
3班    84.000000
Name: 语文, dtype: float64
"""

b=df.groupby(["班级","姓名"])
print(b["数学"].mean())
"""
班级  姓名
1班  张三    98.0
    李三    78.0
    赵四    88.0
2班  刘五    68.0
    张四    77.0
    赵三    89.0
3班  刘六    83.0
    李四    94.0
    陈七    78.0
Name: 数学, dtype: float64
"""
10.1.2 aggregate方法 多聚合函数

可以对DataFrameGroupBy对象调用aggregate方法,同时进行多种聚合函数的应用。

DataFrameGroupBy.aggregate(func)
  • func可为字符串(代表各种数值计算函数)[列表],也可为自己创建的聚合函数对象[列表],还可为字典(key为列名,value为该列应用的聚合函数)

如:

c=df.groupby("班级")
print(c[["语文","数学"]].aggregate(["mean","max","min","var"]))
"""
           语文                         数学               
         mean  max min         var  mean max min    var
班级                                                     
1班  86.333333  100  67  296.333333  88.0  98  78  100.0
2班  91.666667   99  87   41.333333  78.0  89  68  111.0
3班  84.000000   88  79   21.000000  85.0  94  78   67.0
"""

print(c.aggregate({"语文":"mean","数学":["max","min"],"英语":"min"}))
"""
           语文  数学      英语
         mean max min min
班级                       
1班  86.333333  98  78  56
2班  91.666667  89  68  69
3班  84.000000  94  78  79
"""

print(c[["语文","数学","英语"]].aggregate(lambda x: max(x) - min(x)))
"""
    语文  数学  英语
班级            
1班  33  20  33
2班  12  21  20
3班   9  16  15
"""

10.2 数据透视表

数据透视表类似于使用两种键来对数据进行分组,一种(内含多个)键作行索引,一种(内含多个)键作列索引。

Excel

点击菜单栏"插入">“数据透视表”:

在这里插入图片描述

选择数据源,选择数据透视表要放在的位置,点击"确定":

在这里插入图片描述

在弹出的"数据透视表字段"界面中,可以交互式地拖动各字段到指定区域。

"列"区域:指定作为列索引的字段

"行"区域:指定作为行索引的字段

"值"区域:指定作为展示数据并需进行计算的字段并设置对应聚合函数

最终的效果:

在这里插入图片描述

在这里插入图片描述

当然,看起来比较丑,可以自行编辑美化。

Python

主要通过pivot_table方法来是实现数据透视表。

df.pivot_table(values=None,
               index=None,
               columns=None,
               aggfunc='mean',
               fill_value=None,
               margins=False,
               dropna=True,
               margins_name='All',
               sort=True,)
  • values设置展示数据并需进行计算的字段。同Excel的"值"区域。
  • index设置行字段。同Excel的"行"区域
  • colomns设置列字段。同Excel的"列"区域
  • aggfunc设置各 值列 应用的聚合函数。
  • fill_value设置缺失值的替换值。
  • margins设置是否有汇总行/列。
  • dropna设置忽略空值
  • margin_name设置汇总行/列的名称。
  • sort设置结果是否进行排序。
print(df)
"""
    年级  班级  姓名   语文  数学  英语
0   高三  1班  蹦蹦   89  87  88
1   高一  3班  陈七   85  78  79
2   高二  2班  咕咕   90  85  88
3   高二  1班  拉拉   98  89  88
4   高二  1班  李三   92  78  89
5   高二  3班  李四   79  94  92
6   高三  3班  刘六   88  83  94
7   高三  2班  刘五   99  68  69
8   高三  3班  皮卡   78  83  88
9   高一  1班  琪琪   78  89  88
10  高一  1班  张三  100  98  89
11  高二  2班  张四   89  77  78
12  高一  2班  赵三   87  89  89
13  高三  1班  赵四   67  88  56
"""

a = df.pivot_table(values=["语文", "数学", "英语"],
                   index="年级",
                   columns="班级",
                   aggfunc="mean")
print(a)
"""
      数学                英语                语文            
班级    1班    2班    3班    1班    2班    3班    1班    2班    3班
年级                                                      
高一  93.5  89.0  78.0  88.5  89.0  79.0  89.0  87.0  85.0
高三  87.5  68.0  83.0  72.0  69.0  91.0  78.0  99.0  83.0
高二  83.5  81.0  94.0  88.5  83.0  92.0  95.0  89.5  79.0
"""

b = df.pivot_table(values=["语文"],
                   index="年级",
                   columns="班级",
                   aggfunc="mean",
                   margins=True,
                   margins_name="总平均")
print(b)
"""
            语文                        
班级          1班     2班    3班        总平均
年级                                    
高一   89.000000  87.00  85.0  87.500000
高三   78.000000  99.00  83.0  84.200000
高二   95.000000  89.50  79.0  89.600000
总平均  87.333333  91.25  82.5  87.071429
"""
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木子希卡利

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值