数据聚合与分组运算(数据分析)

137 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情

1.为什么要了解聚合和分组

对数据集进行分组并对各组应用一个函数(无论是聚合还是转换),通常是数据分析工作中的重要环节。 在将数据集加载、融合、准备好之后,通常就是计算分组统计或生成透视表。 pandas提供了一个灵活高效的gruopby功能, 它使我们能以一种自然的方式对数据集进行切片、切块、摘要等操作。

关系型数据库和SQL(Structured Query Language, 结构化查询语言) 能够如此流行的原因之一就是其能够方便地对数据进行连接、过滤、转换和聚合。但是,像SQL这样的查询语言所能执行的分组运算的种类很有限。由于Python和pandas强大的表达能力,我们可以执行复杂得多的分组运算(利用任何可以接受pandas对象或NumPy数组的函数)。

2.GroupBy机制

分组键可以有多种形式, 且类型不必相同:

  1. 列表或数组, 其长度与待分组的轴一样。
  2. 表示DataFrame某个列名的值。
  3. 字典或Series, 给出待分组轴上的值与分组名之间的对应关系。
  4. 函数, 用于处理轴索引或索引中的各个标签。

注意, 后三种都只是快捷方式而已, 其最终目的仍然是产生一组用于拆分对象的值。首先来看看下面这个非常
简单的表格型数据集(以DataFrame的形式):

image.png

import numpy as np
import pandas as pd
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:

image.png

grouped=df['data1'].groupby(df['key1'])
grouped

变量grouped是一个GroupBy对象。 它实际上还没有进行任何计算, 只是含有一些有关分组键df['key1']的中间数据而已。换句话说,该对象已经有了接下来对各分组执行运算所需的一切信息。例如,我们可以调用GroupBy的mean方法来计算分组平均值:

image.png

grouped.mean()

如果我们一次传入多个数组的列表, 就会得到不同的结果

image.png

means=df['data1'].groupby([df['key1'],df['key2']]).mean()
means

2.1 通过字典或Series进行分组

image.png

people=pd.DataFrame(np.random.randn(5,5),columns=['a','b','c','d','e'],
                    index=['joe','steve','wes','jim','travil'])
people.iloc[2:3,[1,2]]=np.nan
people

3.数据聚合

3.1什么是数据聚合?

聚合指的是任何能够从数组产生标量值的数据转换过程。

我们可以使用自己发明的聚合运算,还可以调用分组对象上已经定义好的任何方法。 例如, quantile可以计算Series或DataFrame列的样本分位数。虽然quantile并没有明确地实现于GroupBy, 但它是一个Series方法, 所以这里是能用的。实际上,GroupBy会高效地对Series进行切片,然后对各片调用piece.quantile(0.9), 最后将这些结果组装成最终结果。

image.png

grouped=df.groupby('key1')
grouped['data1'].quantile(0.9)