【基本工具】S02E16 GroupBy使用方法(下篇):累计、过滤、转换与应用

0.本集概览

1.GroupBy的累计、过滤、转换和应用功能
2.GroupBy分组键的自定义
3.索引名称的别名索引

上一集里,我们对GroupBy的概念和运行机理进行了重点介绍,这一集在之前的基础上,我们要重点介绍他的一些核心方法,围绕累计、过滤、转换和应用这四个层面。

光说这几个词未免显得空洞,那么我们还是一个一个来举例说明:

这一集里我们所有的操作对象都是这个DataFrame数据对象:
代码片段:

import numpy as np
import pandas as pd

rng = np.random.RandomState(0)
df = pd.DataFrame({'key':['A','B','C','A','B','C'],
                   'data1': range(6),
                   'data2': rng.randint(0,10,6)})

print(df)

运行结果:

   data1  data2 key
0      0      5   A
1      1      0   B
2      2      3   C
3      3      3   A
4      4      7   B
5      5      9   C

1.累计

首先说说累计

上一集里其实我们已经谈到了GroupBy中的累计方法:sum(),median()等等,但是这些函数的功能都比较的简单和单一,一次只能对DataFrame的各列运用一种累计方法,且各列运用的方法也是一致的。

但如果我们想实现更复杂的效果,例如以key作为分组,对每一组分别求最大值、最小值和中位数,或者对每一列分别应用不一样的累计函数,那么就得用上我们的aggregate方法了。
代码片段:

print(df.groupby('key').aggregate(['min', np.median, 'max']))

运行结果:

    data1            data2           
      min median max   min median max
key                                  
A       0    1.5   3     3    4.0   5
B       1    2.5   4     0    3.5   7
C       2    3.5   5     3    6.0   9

这就实现了对分组使用多个累计方法,如果针对每个不同的属性列使用各自不同的累计方法呢?也不难:
代码片段:

print(df.groupby('key').aggregate({'data1':'min','data2':'max'}))

运行结果:

     data1  data2
key              
A        0      5
B        1      7
C        2      9

我们在aggregate中使用了一个字典,分别指明了各列对应使用的累计方法。

2.过滤

再说说过滤

我们在往集中谈到过过滤的话题,不过这里我们说的是分组过滤,指的是如果不满足条件,就直接丢弃整个分组

比如我们来丢弃标准差小于4的分组:
代码片段:

print(df)
print(df.groupby('key').std())
def filter_func(x):
    return x['data2'].std() > 4

print(df.groupby('key').filter(filter_func))

运行结果:

   data1  data2 key
0      0      5   A
1      1      0   B
2      2      3   C
3      3      3   A
4      4      7   B
5      5      9   C

       data1     data2
key                   
A    2.12132  1.414214
B    2.12132  4.949747
C    2.12132  4.242641

   data1  data2 key
1      1      0   B
2      2      3   C
4      4      7   B
5      5      9   C

filter_func函数返回一个布尔值,标准差小于4的时候返回False,则被过滤掉。

3.转换

继续说,说一下转换的用法:

之前的累计操作返回的是以组为单位的结果,直观的看,数据规模肯定是小于原始数据,但是过滤则不一样,他返回的是一个全量数据,其形状与原始输入数据一致。

比如,我们来将每一组的数值减去所在组的均值:
代码片段:

print(df)
print(df.groupby('key').transform(lambda x: x - x.mean()))

运行结果:
```
data1 data2 key
0 0 5 A
1 1 0 B
2 2 3 C
3 3 3 A

top Created with Sketch.