学习内容
pandas聚合运算
重点
1.聚合agg函数使用
import pandas as pd
import numpy as np
df = pd.DataFrame({'key1': ['a', 'b', 'c', 'a', 'c', 'c', 'a', 'b', 'd'],
'ket2': ['one', 'two', 'one', 'one', 'two', 'one', 'three', 'one', 'three'],
'data1': np.random.randint(1, 10, 9),
'data2': np.random.randint(10, 20, 9)})#创建数组
def peak_range(s):#创建聚合函数
print(type(s))
return s.max() - s.min()
grouped=df.groupby("key1")
print(grouped.agg(peak_range))#聚合运算返回最大减去最小值
#这里为什么使用agg聚合,不使用apply应用是因为在这里key2也作为一列内容,agg会默认删掉除数字之外的函数进行计算,如果使用apply就必须保持一般性,需要让所有数据都满足!
data1 data2
key1
a 5 6
b 1 4
c 8 3
d 0 0
#聚合运算可以同时聚合多个运算
print(grouped.agg(['mean', 'std', 'sum', ('range',peak_range)]))
#注意,这里的运算名称要包含在列表里面,('range',peak_range)这里就将peak_range改名为range
data1 data2
mean std sum range mean std sum range
key1
a 4.000000 3.464102 12 6 15.333333 4.618802 46 8
b 7.000000 1.414214 14 2 11.500000 2.121320 23 3
c 2.333333 1.527525 7 3 17.666667 1.527525 53 3
d 5.000000 NaN 5 0 14.000000 NaN 14 0
我定义的数组有两个数据,data1和data2,但是如果我希望不同的数据执行不同的操作,这时候就需要用到字典表
b = {"data1": ['sum', ('range', peak_range)],
"data2": "mean"}
print(grouped.agg(b))
data1 data2
sum range mean
key1
a 20 7 14.000000
b 10 6 14.000000
c 16 5 13.666667
d 1 0 13.000000
我们想让key1的值也成为数据,单独加上一个行索引
grouped = df.groupby("key1",as_index=False)
#第一种方法是在分组时使用as_index
print(grouped.agg(b).reset_index())
#第二种是在聚合的时候重新设置索引,使用reset_index()指令
key1 data1 data2
sum range mean
0 a 23 2 16.333333
1 b 17 1 14.500000
2 c 10 6 15.333333
3 d 9 0 18.000000
2.transform函数的使用
transform输出的形状和输入一致,保持了与原始数据集相同数量的项目,这样就很好继续之后的操作
import pandas as pd
import numpy as np
df = pd.DataFrame({'key1': ['a', 'b', 'c', 'a', 'c', 'c', 'a', 'b', 'd'],
'ket2': ['one', 'two', 'one', 'one', 'two', 'one', 'three', 'one', 'three'],
'data1': np.random.randint(1, 10, 9),
'data2': np.random.randint(10, 20, 9)})
grouped = df.groupby("key1").transform(np.mean).add_prefix("mean_")
#按key1分组,但是求每个数值的平均值,add_prefix是在更改索引名称
print(df)
print(grouped)
key1 ket2 data1 data2
0 a one 1 13
1 b two 1 14
2 c one 2 19
3 a one 8 11
4 c two 7 16
5 c one 8 14
6 a three 8 17
7 b one 9 14
8 d three 5 19
mean_data1 mean_data2
0 5.666667 13.666667
1 5.000000 14.000000
2 5.666667 16.333333
3 5.666667 13.666667
4 5.666667 16.333333
5 5.666667 16.333333
6 5.666667 13.666667
7 5.000000 14.000000
8 5.000000 19.000000
#将得到的数据与之前的df拼接
df[grouped.columns]=grouped
print(df)
key1 ket2 data1 data2 mean_data1 mean_data2
0 a one 2 18 6.333333 16.333333
1 b two 5 10 5.500000 14.000000
2 c one 8 14 5.000000 17.000000
3 a one 9 16 6.333333 16.333333
4 c two 1 18 5.000000 17.000000
5 c one 6 19 5.000000 17.000000
6 a three 8 15 6.333333 16.333333
7 b one 6 18 5.500000 14.000000
8 d three 5 14 5.000000 14.000000
#因为我使用的是随机数,每次结果会不一样