自己的网站建设墨子学院seo
对数据集进行分组并对各组应用一个函数(无论是聚合还是转换),通常是 数据分析工作中的重要环节。在将数据集加载、融合、准备好之后,通常就 是计算分组统计或生成透视表。pandas提供了一个灵活高效的gruopby功 能,它使你能以一种自然的方式对数据集进行切片、切块、摘要等操作。
关系型数据库和SQL(Structured Query Language,结构化查询语言)能够 如此流行的原因之一就是其能够方便地对数据进行连接、过滤、转换和聚 合。但是,像SQL这样的查询语言所能执行的分组运算的种类很有限。在本篇博客中你将会看到,由于Python和pandas强大的表达能力,我们可以执行复杂 得多的分组运算(利用任何可以接受pandas对象或NumPy数组的函数)。在 本博客中,你将会学到:
- 使用一个或多个键(形式可以是函数、数组或DataFrame列名)分割pandas对象。
- 计算分组的概述统计,比如数量、平均值或标准差,或是用户定义的函 数。
- 应用组内转换或其他运算,如规格化、线性回归、排名或选取子集等。
- 计算透视表或交叉表。
- 执行分位数分析以及其它统计分组分析。
对时间序列数据的聚合(groupby的特殊用法之一)也称作重采 样(resampling),后续会单独对其进行讲解。
目录
1. GroupBy
2. 对分组进行迭代
3. 选取一列或列的子集
4. 通过字典或Series进行分组
5. 通过函数进行分组
6. 根据索引级别分组
1. GroupBy
Hadley Wickham(许多热门R语言包的作者)创造了一个用于表示分组运算 的术语"split-apply-combine"(拆分-应用-合并)。第一个阶段,pandas对 象(无论是Series、DataFrame还是其他的)中的数据会根据你所提供的一 个或多个键被拆分(split)为多组。拆分操作是在对象的特定轴上执行的。 例如,DataFrame可以在其行(axis=0)或列(axis=1)上进行分组。然 后,将一个函数应用(apply)到各个分组并产生一个新值。最后,所有这些 函数的执行结果会被合并(combine)到最终的结果对象中。结果对象的形 式一般取决于数据上所执行的操作。下图大致说明了一个简单的分组聚合 过程。
分组键可以有多种形式,且类型不必相同:
- 列表或数组,其长度与待分组的轴一样。
- 表示DataFrame某个列名的值。
- 字典或Series,给出待分组轴上的值与分组名之间的对应关系
- 函数,用于处理轴索引或索引中的各个标签。
注意,后三种都只是快捷方式而已,其最终目的仍然是产生一组用于拆分对 象的值。如果觉得这些东西看起来很抽象,不用担心,我将在本博客中给出大 量有关于此的示例。首先来看看下面这个非常简单的表格型数据集(以DataFrame的形式):
import numpy as np
import pandas as pd
PREVIOUS_MAX_ROWS = pd.options.display.max_rows
pd.options.display.max_rows = 20
np.random.seed(12345)
import matplotlib.pyplot as plt
plt.rc('figure', figsize=(10, 6))
np.set_printoptions(precision=4, suppress=True)
df = pd.DataFrame({'key1' : ['a', 'a', 'b', 'b', 'a'],'key2' : ['one', 'two', 'one', 'two', 'one'],'data1' : np.random.randn(5),'data2' : np.random.randn(5)})
df
假设你想要按key1进行分组,并计算data1列的平均值。实现该功能的方式 有很多,而我们这里要用的是:访问data1,并根据key1调用groupby:
grouped = df['data1'].groupby(df['key1'])
grouped
变量grouped是一个GroupBy对象。它实际上还没有进行任何计算,只是含 有一些有关分组键df['key1']的中间数据而已。换句话说,该对象已经有了接 下来对各分组执行运算所需的一切信息。例如,我们可以调用GroupBy的mean方法来计算分组平均值:
grouped.mean()