数据分组与数据透视表
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
"""