20. 分组
20.1 groupby
>>> df1 = pd.DataFrame(
... {'key1':list('abcdefgh'),'data1':np.random.randint(-5,10,8),'key2':list('11223344'),
... 'data2':np.random.randint(-5,10,8)}
... )
>>> df1
key1 data1 key2 data2
0 a -4 1 5
1 b 1 1 5
2 c 6 2 -2
3 d 4 2 7
4 e 4 3 4
5 f 3 3 2
6 g 4 4 2
7 h 7 4 1
>>> gr1 = df1.groupby(df1['key2'])
>>> gr1
<pandas.core.groupby.groupby.DataFrameGroupBy object at 0x000001602DE85128>
>>> for name,obj in gr1:
... print(name)
... print(obj)
... print('##########################')
1
key1 data1 key2 data2
0 a -4 1 5
1 b 1 1 5
##########################
2
key1 data1 key2 data2
2 c 6 2 -2
3 d 4 2 7
##########################
3
key1 data1 key2 data2
4 e 4 3 4
5 f 3 3 2
##########################
4
key1 data1 key2 data2
6 g 4 4 2
7 h 7 4 1
##########################
>>> gr1.sum()
data1 data2
key2
1 -3 10
2 10 5
3 7 6
4 11 3
注意点:
- 分组完成之后,返回的是一个分组独享
- 分组之后,可以使用函数进行下一步的处理
- 进行计算的过程中,非数字的数据不用参与计算
- 当迭代分组对象的时候,每个元素的形式(分组名,属于该分组的数据)
- 属于该分组的数据,也是
dataframe
对象
20.2 分组对象转python数据类型
>>> list(gr1)
[('1', key1 data1 key2 data2
0 a -4 1 5
1 b 1 1 5),
('2', key1 data1 key2 data2
2 c 6 2 -2
3 d 4 2 7),
('3', key1 data1 key2 data2
4 e 4 3 4
5 f 3 3 2),
('4', key1 data1 key2 data2
6 g 4 4 2
7 h 7 4 1)]
>>> dict(list(gr1))
{'1': key1 data1 key2 data2
0 a -4 1 5
1 b 1 1 5,
'2': key1 data1 key2 data2
2 c 6 2 -2
3 d 4 2 7,
'3': key1 data1 key2 data2
4 e 4 3 4
5 f 3 3 2,
'4': key1 data1 key2 data2
6 g 4 4 2
7 h 7 4 1}
- list格式:
[(组名,dataframe对象),(组名,dataframe对象),(组名,dataframe对象)]
- dict格式:
{组名:dataframe对象,组名:dataframe对象,组名:dataframe对象}
20.3 聚合
常常用于分组之后的数据计算
20.3.1 内置的聚合函数
sum()
:求和mean()
:均值max()
:最大值min()
:最小值count()
:计数size()
:大小describe()
:详情
>>> df1
key1 data1 key2 data2
0 a -4 1 5
1 b 1 1 5
2 c 6 2 -2
3 d 4 2 7
4 e 4 3 4
5 f 3 3 2
6 g 4 4 2
7 h 7 4 1
>>> gr2 = df1.groupby(df1['key1'])
>>> gr2
<pandas.core.groupby.groupby.DataFrameGroupBy object at 0x000001602DE855F8>
>>> gr2.size()
key1
a 1
b 1
c 1
d 1
e 1
f 1
g 1
h 1
dtype: int64
>>> gr2.count()
data1 key2 data2
key1
a 1 1 1
b 1 1 1
c 1 1 1
d 1 1 1
e 1 1 1
f 1 1 1
g 1 1 1
h 1 1 1
>>> gr2.sum()
data1 data2
key1
a -4 5
b 1 5
c 6 -2
d 4 7
e 4 4
f 3 2
g 4 2
h 7 1
>>> gr2.describe()
data1 data2
count mean std min 25% 50% 75% max count
key1
a 1.0 -4.0 NaN -4.0 -4.0 -4.0 -4.0 -4.0 1.0 ...
b 1.0 1.0 NaN 1.0 1.0 1.0 1.0 1.0 1.0 ...
c 1.0 6.0 NaN 6.0 6.0 6.0 6.0 6.0 1.0 ...
d 1.0 4.0 NaN 4.0 4.0 4.0 4.0 4.0 1.0 ...
e 1.0 4.0 NaN 4.0 4.0 4.0 4.0 4.0 1.0 ...
f 1.0 3.0 NaN 3.0 3.0 3.0 3.0 3.0 1.0 ...
g 1.0 4.0 NaN 4.0 4.0 4.0 4.0 4.0 1.0 ...
h 1.0 7.0 NaN 7.0 7.0 7.0 7.0 7.0 1.0 ...
20.3.2 agg()自定义函数做聚合运算
>>> gr2.agg(['max','min'])
data1 key2 data2
max min max min max min
key1
a -4 -4 1 1 5 5
b 1 1 1 1 5 5
c 6 6 2 2 -2 -2
d 4 4 2 2 7 7
e 4 4 3 3 4 4
f 3 3 3 3 2 2
g 4 4 4 4 2 2
h 7 7 4 4 1 1
# 使用内置的聚合函数起中文名
>>> gr2.agg([('最大值','max'),('最小值','min')])
data1 key2 data2
最大值 最小值 最大值 最小值 最大值 最小值
key1
a -4 -4 1 1 5 5
b 1 1 1 1 5 5
c 6 6 2 2 -2 -2
d 4 4 2 2 7 7
e 4 4 3 3 4 4
f 3 3 3 3 2 2
g 4 4 4 4 2 2
h 7 7 4 4 1 1
# 针对不同的列,使用不同的聚合函数
>>> gr2.agg({
... 'data1':[('最大值','max')],
... 'data2':['min']
... })
data1 data2
最大值 min
key1
a -4 5
b 1 5
c 6 -2
d 4 7
e 4 4
f 3 2
g 4 2
h 7 1
注意点:
agg()
填充的是函数,如果需要使用内置的聚合函数,用字符串的形式填写- 如果使用内置的函数在起别名的时候,注意(字符串的形式)
>>> def func(x):
... return x.max()-x.min()
>>> gr1.agg(func)
data1 data2
key2
1 5 0
2 2 9
3 1 2
4 3 1
>>> gr1.agg(lambda x:x.max()-x.min())
data1 data2
key2
1 5 0
2 2 9
3 1 2
4 3 1