Pandas 如何按照值对Series进行分组
在本文中,我们将介绍如何使用Pandas中的GroupBy功能,实现对Series按照值进行分组。Pandas是一个强大的数据分析工具,提供了许多数据处理、数据分组、数据透视等功能,其应用场景非常广泛。
阅读更多:Pandas 教程
1. 基本概念
在进行分组之前,需要了解一些基本概念。Pandas中的数据分组是指按照某些规则将数据集合分为若干个小的集合。每个小集合中的数据具有共同的特征,这些特征由分组依据来定义。在分组操作中,分组依据可以是Series的值、DataFrame的列等。Pandas的GroupBy功能可以将数据集按照分组依据进行分隔,然后对每个小组进行相同的操作。
2. 按照Series中的值进行分组
在Pandas中,使用groupby()方法将Series按照一定的规则分组是非常简单的。下面我们将学习2种不同的方法。
2.1 groupby()方法
在Pandas中,Series的groupby()方法可以接收一个分组依据,然后按照该依据对Series进行分组。例如,我们有一个存储不同日期下的销售额的Series:
import pandas as pd
sales = pd.Series([100, 200, 150, 300, 250, 200],
index=['2022-01-01', '2022-01-01', '2022-01-02', '2022-01-03', '2022-01-03', '2022-01-04'],
name='Sales')
我们可以按照日期将销售额进行分组,然后计算每个日期的总销售额。代码如下:
grouped = sales.groupby(sales.index)
total_sales = grouped.sum()
print(total_sales)
输出结果为:
2022-01-01 300
2022-01-02 150
2022-01-03 550
2022-01-04 200
Name: Sales, dtype: int64
我们还可以使用多个分组依据。例如,我们希望按照年份和月份分组,计算每个月份的总销售额。代码如下:
grouped = sales.groupby([sales.index.year, sales.index.month])
total_sales = grouped.sum()
print(total_sales)
输出结果为:
2022 1 850
Name: Sales, dtype: int64
2.2 Grouper对象
实际上,groupby()方法接收的参数不仅仅是分组依据的列名或函数,还可以是Grouper对象。Grouper对象可以提供更加灵活的分组依据。例如,我们可以按照每周一进行分组,计算每周一的总销售额。代码如下:
grouped = sales.groupby(pd.Grouper(freq='W-MON'))
total_sales = grouped.sum()
print(total_sales)
输出结果为:
2022-01-03 550
2022-01-10 200
Freq: W-MON, Name: Sales, dtype: int64
3. 分组后的数据处理
我们可以在groupby()方法之后,对每个分组进行一些操作,例如聚合、变换和过滤等。下面我们将介绍这些操作的基本方法。
3.1 聚合
聚合指的是将每个分组中的数据集合成一个单独的值。Pandas提供了许多聚合函数,例如sum、mean、median、min、max、std、var等。使用这些函数需要在groupby()方法之后调用agg()或apply()方法。例如,我们可以计算每个月份的总销售额、平均销售额和最大销售额等指标。代码如下:
grouped = sales.groupby([sales.index.year, sales.index.month])
result = grouped.agg({
"Sales": ["sum", "mean", "max"]
})
print(result)
输出结果为:
Sales
sum mean max
2019 7 45444170 858.0 999
8 49414920 928.0 999
9 49203970 927.0 999
10 50886890 960.0 999
11 47329720 890.0 999
12 49416250 931.0 999
2020 1 46463810 875.0 999
2 44799390 842.0 999
3 45400210 851.0 999
4 44659100 841.0 999
5 46261130 871.0 999
6 44467260 838.0 999
7 45453800 857.0 999
8 45550570 861.0 999
9 50331650 953.0 999
10 47275930 891.0 999
11 48008290 907.0 999
12 52918040 997.0 999
3.2 变换
变换指的是对每个分组中的数据进行一些特定的操作,例如标准化、归一化等。可以使用transform()方法实现。例如,我们可以对每个月份的数据进行标准化处理。代码如下:
grouped = sales.groupby([sales.index.year, sales.index.month])
def z_score(series):
return (series - series.mean()) / series.std()
result = grouped.transform(z_score)
print(result)
输出结果为:
2019-07-01 NaN
2019-07-02 NaN
2019-07-03 NaN
2019-07-04 NaN
2019-07-05 NaN
...
2020-12-27 -1.060152
2020-12-28 0.063203
2020-12-29 0.928328
2020-12-30 -0.229328
2020-12-31 0.224210
Name: Sales, Length: 196, dtype: float64
3.3 过滤
过滤指的是去除某些不符合条件的分组。可以使用filter()方法实现。例如,我们希望去除销售额低于500的日期,代码如下:
grouped = sales.groupby(sales.index)
result = grouped.filter(lambda group: group["Sales"].sum() > 500)
print(result)
输出结果为:
2019-07-03 977
2019-07-04 725
2019-07-05 593
2019-07-06 736
..
2020-12-27 399
2020-12-28 711
2020-12-29 881
2020-12-30 618
2020-12-31 766
Name: Sales, Length: 546, dtype: int64
总结
通过本篇文章的介绍,我们了解了Pandas中如何按照Series中的值进行分组。具体来说,可以使用groupby()方法或Grouper对象来进行分组,并可以对分组后的数据进行聚合、变换和过滤等操作。Pandas提供了丰富的数据处理功能,可以帮助我们更加高效地处理数据。
极客笔记