Pandas 如何按照值对Series进行分组

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提供了丰富的数据处理功能,可以帮助我们更加高效地处理数据。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程