0 分组聚合原理
在Pandas中,分组是指使用特定的条件将原数据划分为多个组,聚合在这里指的是,对每个分组中的数据执行某些操作,最后将计算的结果进行整合。
1 groupby
方法
1.1 语法
1 | groupby(by=None, axis=0, level=None, as_index=True, sort=True,group_keys=True, squeeze=False, observed=False, **kwargs) |
by
:用于确定进行分组的依据axis
:表示分组轴的方向sort
:表示是否对分组标签进行排序,接收布尔值,默认为True
by
参数可接收的数据主要有:列表或数组、DataFrame某列、字典或Series对象、函数
1.2 实例
1.2.1 按照Key进行分组,使用列索引字段
1 | import pandas as pd |
输出
1 | ('A', Key Data |
可以看出,程序通过关键词
Key
将数据分为三组:
1.2.2 使用series
进行分组
1 | import pandas as pd |
输出
1 | ('a', Key Data |
通过
Series
对象来分组可以理解成在原DataFrame
数据中添加了一列数据,分组时以该列数据作为key
进行索引分组。如果Series
对象的索引长度大于或小于源数据,不会报错只会输出交集部分。
1.2.3 通过字典进行分组
1 | import pandas as pd |
输出
1 | ('第一组', A B |
可以发现
A
,B
已经放入了第一组
,而C
放入了第二组
,注意组中只会包括字典中的元素,例如:
1
2
3
4
5
6
7
8
9
10
11 import pandas as pd
data = pd.DataFrame({
'A': [1, 2, 3, 4, 5],
'B': [6, 7, 8, 9, 10],
'C': [11, 12, 13, 14, 15],
'D': [16, 17, 18, 19, 20]
})
mapping = {'A': '第一组', 'B': '第一组', 'C': '第二组'}
by_dict = data.groupby(mapping, axis=1)
for i in by_dict:
print(i)输出:
1
2
3
4
5
6
7
8
9
10
11
12 ('第一组', A B
0 1 6
1 2 7
2 3 8
3 4 9
4 5 10)
('第二组', C
0 11
1 12
2 13
3 14
4 15)
1.2.4 通过函数分组
1 | import pandas as pd |
输出
1 | (2, A B C D |
通过长度函数
len
对数据进行分组
2 数据聚合
数据聚合,一般是指对分组中的数据执行某些操作,例如平均值、最大值,操作之后会得到一个结果集,这些实现聚合的操作称为聚合方法。
2.1 内置的统计方法聚合数据
例如我们对下表数据按key1
分组后求每个分组的平均值:
key1 | key2 | data1 | data2 | |
---|---|---|---|---|
0 | A | one | 2 | 3.0 |
1 | A | two | 3 | 5.0 |
2 | B | one | 4 | NaN |
3 | B | two | 6 | 3.0 |
4 | A | one | 8 | 7.0 |
2.1.1 实例代码
1 | import pandas as pd |
2.1.2 输出
1 | data1 data2 |
如果原数据为:
1 | data = pd.DataFrame({ |
则输出为:
1 | data1 data2 |
可知如果参与运算的数据中有NaN
值则会自动过滤这些NaN
值。
2.2 面向列的聚合方法
当内置的方法无法满足需求时可以自定义一个函数传给agg()
方法实现对Series
或DataFrame
对象进行聚合运算。
2.2.1 agg()
函数
语法
1 | agg(func,axis=0,*args,**kwargs) |
func
:表示用于汇总数据的函数,可以为单个函数或函数列表axis
:表示函数作用于轴的方向
对每一列数据应用同一函数
通过对表格中的key
值进行分组,计算每个分组中每列数据的和
1 | import pandas as pd |
输出
1 | a b c d e f |
拓展:
可以通过:
1 print(dict([x for x in data_gr])['a'])获取
a
组的数据:
1
2
3
4 a b c d e f key
0 0 1 2 3 4 5 a
1 6 7 8 9 10 11 a
2 12 13 14 15 16 17 a
拓展:
通过
agg()
使用自定义函数在下述代码中将定义一个求每个分组数据的极差值的函数(最大值-最小值)
1 | import pandas as pd |
输出:
1 | a b c d e f |