python_pandas DAY_19(1)聚合运算

学习内容
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
#因为我使用的是随机数,每次结果会不一样
发布了41 篇原创文章 · 获赞 1 · 访问量 931

猜你喜欢

转载自blog.csdn.net/soulproficiency/article/details/104092036