Python_tips-Grouper允许指定groupby指令

万壑松风知客来,摇扇抚琴待留声

1. 简介

又是一个好用的 pandas 技巧工具——Grouper,Grouper 允许用户为目标对象指定 groupby 指令。按照该指令来对数据集进行划分,在数据分析中这是一个很实用的方法,正确合理的使用将会大大提高工作效率。下面对该方法做一个简单的叙述。

2. Grouper

官方文档

1
pd.Grouper(key=None, level=None, freq=None, axis=0, sort=False)

参数说明:

  • key:用来指定 groupby 所作用目标数据的分组列(某些列特征),默认为 None。
  • level:目标索引的级别。名称/数字,默认无。
  • freq:如果目标列(通过 key 或 level )选择是类似日期时间的对象,则将按指定的频率进行分组。有关可用频率的完整规格,请参见此处。默认为 None。
  • axis:轴的编号,1 为列,默认值 0 为行。
  • sort:是否对生成的标签进行排序。默认为 False。
2.1. groupby 的常用法

groupby 是一个实用的 Python 数据划分技巧,不过大多数时候我们都只是浅显的使用,尽管这已经很实用了。前面有一篇 groupby 文章已经做了简单的相关介绍,比如直接在 groupby 函数中添加需要用来作为分组的列,然后应用计算方法得到划分结果:

1
df.groupby(['code','date']).mean()

至多再添加几个 groupby 的内置参数,但高效使用挖掘函数内在才是每个极客所追求的——程序员是绅士而懒惰的。所以我们再来简单探索一下它还能使用什么方法。

2.2. 用 Grouper 来制定规则

前面已经介绍了 Grouper 的参数含义,所以下面直接用简短的代码来阐述它的使用方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 生成数据
import pandas as pd
import numpy as np

b = pd.date_range(start='2019-01-01', end='2019-04-30', freq='D')
a = np.arange(0,b.shape[0])
c = np.random.randint(0, 10, size=b.shape[0])
df = pd.DataFrame({'a':a, 'date':b, 'c':c})
print(df.head())

# a date c
# 0 0 2019-01-01 1
# 1 1 2019-01-02 4
# 2 2 2019-01-03 4
# 3 3 2019-01-04 2
# 4 4 2019-01-05 9

对数据集 df 按照时间序列 date,进行按周划分数据,并应用函数(简单求和 sum() )得到结果。

1
2
3
4
5
6
7
8
df = df.groupby([pd.Grouper(key='date', freq='W', axis=0)], as_index=False).sum()

# a c
# 0 15 18
# 1 63 23
# 2 112 27
# 3 161 29
# 4 210 31

当然也可以同时指定多个划分列,只需要和 Groupby 并列指定即可。依据该方法可以对时间数据集按照某个特征在某个时间周期下的数据结果划分。

1
2
3
4
5
6
7
8
9
df = df.groupby([pd.Grouper(key='date', freq='W', axis=0), 'c'], as_index=False).sum()

# c列划分特征将会保留
# c a
# 0 0 2
# 1 2 1
# 2 3 0
# 3 6 4
# 4 8 5

很简单,很方便,当然更多的划分频率可以参考上面的 freq 参数官方文档,更多使用方法也可以自行尝试。

3. 总结

平时事情也很多,不论是学习还是工作还是生活上,所以时间很紧,不过这些实用且生僻的 Python 知识点已经有不少了,我会抽出时间一一做相关记录。