在
默认情况下,分组聚合后的索引会进行排序
,可能会降低运行速度,所以,在
数据量很大的时候可以设置sort = False,指定不进行排序以提高分组速度
;
>>> df.groupby('class',sort = False).mean()
score_math score_music
class
A 93.0 85.00
B 86.5 79.75
C 76.0 90.50
二、对分组进行迭代
GroupBy对象是一个可迭代对象,所以可以通过迭代获取分组名和数据;
例如:获取班级的分组名和数据(
若按多个键进行分组,则分组名变成元组
)
>>> grouped = df.groupby('class')
>>> for name,group in grouped:
... print(name)
... print(group)
... print('-'*40)
class sex score_math score_music
0 A male 95 79
1 A female 96 90
7 A male 88 86
----------------------------------------
class sex score_math score_music
2 B female 85 85
4 B female 84 90
5 B male 88 70
8 B male 89 74
----------------------------------------
class sex score_math score_music
3 C male 93 92
6 C male 59 89
----------------------------------------
三、选择指定组或指定的列
(1)
将分组名及其数据
封装成一个字典
,便于后序选择指定组的数据;
值得
注意
的是:
不可直接将GroupBy对象打包成字典,必须先将其转化成包含多个元组的列表,才能使用dict()将其转换成字典。
>>> grouped = df.groupby('class')
>>> pieces = dict(list(grouped))
>>> len(pieces)
>>> pieces.keys()
dict_keys(['A', 'B', 'C'])
>>> pieces['A']
class sex score_math score_music
0 A male 95 79
1 A female 96 90
7 A male 88 86
(2)GroupBy对象的get_group()也可以达到同样的效果而且更直观
>>> grouped.get_group('A')
class sex score_math score_music
0 A male 95 79
1 A female 96 90
7 A male 88 86
(3)若只需要对指定的列进行GroupBy操作,只需在groupby()后加上指定的列即可
>>> df.groupby('class')['score_math'].mean()
class
A 93.0
B 86.5
C 76.0
>>> df.groupby('class')['score_math','score_music'].mean()
score_math score_music
class
A 93.0 85.00
B 86.5 79.75
C 76.0 90.50