5-Pandas数据分组与聚合(df.Groupby())
GroupBy技术是对于数据进行分组计算并将各组计算结果合并的一项技术,包括以下3个过程:
- 拆分(Spliting):即将数据进行分组
- 应用(Applying):对每组应用函数进行计算
- 合并(Combining):将计算结果进行数据聚合
使用GroupBy()可以沿着任意轴进行分组,并且将分组依据的键作为每组的组名,有一下3种用法:
- df.groupby(key)
- df.groupby(key,axis=1)
- df.groupby([key1,key2])
注:key需要用""引起来
其中的参数axis,可设置是横向分组还是纵向分组,默认是横向分组(axis=0),也是比较常用的。
>>> import pandas as pd >>> import numpy as np >>> df = pd.read_excel('./input/class.xlsx') >>> df class sex score_math score_music 0 A male 95 79 1 A female 96 90 2 B female 85 85 3 C male 93 92 4 B female 84 90 5 B male 88 70 6 C male 59 89 7 A male 88 86 8 B male 89 74 #使用groupby()按照class进行分组,返回的结果是一个GroupBY对象,即拆分过程 >>> df.groupby('class') <pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000024D18D73DA0>
分组时所依据的键的唯一值作为索引,且当传入多个值时将产生层次化索引
>>> df.groupby('class').sum() score_math score_music class A 279 255 B 346 319 C 152 181 >>> df.groupby(['class','sex']).mean() score_math score_music class sex A female 96.0 90.0 male 91.5 82.5 B female 84.5 87.5 male 88.5 72.0 C male 76.0 90.5
在分组时除了传入列表,也可传入一个对于对象行或列长度一致的数组。(并不常用)
例:求按性别分组的各课程平均分,传入性别使用中文表示的一个数组
>>> arr = np.array(['男','女','女','男','女','男','男','男','男']) >>> df.groupby(arr).mean() score_math score_music 女 88.333333 88.333333 男 85.333333 81.666667
.count()
函数可统计各组样本数量,.idxmax()
函数可返回最大值的索引
#按照class和sex分组后各组样本的数量 >>> df.groupby(['class','sex']).count() score_math score_music class sex A female 1 1 male 2 2 B female 2 2 male 2 2 C male 2 2 ##按照class和sex分组后最大值的索引 >>> df.groupby(['class','sex']).idxmax() score_math score_music class sex A female 1 1 male 0 7 B female 2 4 male 8 8 C male 3 3 >>> df.groupby(['class','sex']).count().idxmax() score_math (A, male) score_music (A, male) dtype: object #按照class和sex分组后样本数量最多的索引 >>> df.groupby(['class','sex']).count().idxmax()[0] ('A', 'male')