📜  将操作应用于 Pandas 中的组(1)

📅  最后修改于: 2023-12-03 15:09:36.485000             🧑  作者: Mango

将操作应用于 Pandas 中的组

在 Pandas 中,数据分组是一种非常强大的数据分析工具。它可以让我们轻松地对数据进行统计计算、分组分析等操作。本文将介绍如何将操作应用于 Pandas 中的组。我们将通过一些示例来说明如何使用这些操作。

准备工作

在开始使用 Pandas 进行数据分组操作之前,我们需要准备一些数据。在本文中,我们将使用 Iris 数据集。这是非常著名的数据集,包含了 3 种不同类型的鸢尾花(山鸢尾、变色鸢尾、维吉尼亚鸢尾)的 4 种特征(萼片长度、萼片宽度、花瓣长度、花瓣宽度)的测量值。我们可以通过 Pandas 中的 read_csv 函数来读取该数据集,如下所示:

import pandas as pd

# 读取数据集
df = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data', header=None)

# 添加列名
df.columns = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'class']

# 打印数据集前 5 行
print(df.head())

以上代码将会输出如下结果:

   sepal_length  sepal_width  petal_length  petal_width        class
0           5.1          3.5           1.4          0.2  Iris-setosa
1           4.9          3.0           1.4          0.2  Iris-setosa
2           4.7          3.2           1.3          0.2  Iris-setosa
3           4.6          3.1           1.5          0.2  Iris-setosa
4           5.0          3.6           1.4          0.2  Iris-setosa
分组操作

接下来,我们将介绍如何对上述数据集进行可以应用于 Pandas 中的组的操作。

分组

Pandas 中的 groupby 函数可以将数据按照指定的列进行分组,如下所示:

# 按照 class 列进行分组
grouped = df.groupby('class')

# 打印每组的大小
print(grouped.size())

# 打印每组的前 5 行数据
print(grouped.head())

以上代码将会输出如下结果:

class
Iris-setosa        50
Iris-versicolor    50
Iris-virginica     50
dtype: int64

    sepal_length  sepal_width  petal_length  petal_width            class
0            5.1          3.5           1.4          0.2      Iris-setosa
1            4.9          3.0           1.4          0.2      Iris-setosa
2            4.7          3.2           1.3          0.2      Iris-setosa
3            4.6          3.1           1.5          0.2      Iris-setosa
4            5.0          3.6           1.4          0.2      Iris-setosa
50           7.0          3.2           4.7          1.4  Iris-versicolor
51           6.4          3.2           4.5          1.5  Iris-versicolor
52           6.9          3.1           4.9          1.5  Iris-versicolor
53           5.5          2.3           4.0          1.3  Iris-versicolor
54           6.5          2.8           4.6          1.5  Iris-versicolor
100          6.3          3.3           6.0          2.5   Iris-virginica
101          5.8          2.7           5.1          1.9   Iris-virginica
102          7.1          3.0           5.9          2.1   Iris-virginica
103          6.3          2.9           5.6          1.8   Iris-virginica
104          6.5          3.0           5.8          2.2   Iris-virginica
聚合

分组之后,我们可以对分组后的数据进行聚合操作。例如,我们可以计算每组中的平均值、标准差、中位数等。Pandas 中的 agg 函数可以完成这些操作,如下所示:

# 计算每组的平均值、标准差和中位数
print(grouped.agg(['mean', 'std', 'median']))

# 计算每组中 petal_length 列的平均值和标准差
print(grouped['petal_length'].agg(['mean', 'std']))

以上代码将会输出如下结果:

                sepal_length                     ... petal_width                   
                        mean       std median  ...        mean       std median
class                                          ...                              
Iris-setosa            5.006  0.352490    5.0  ...       0.246  0.105386    0.2
Iris-versicolor        5.936  0.516171    5.9  ...       1.326  0.197753    1.3
Iris-virginica         6.588  0.635880    6.5  ...       2.026  0.274650    2.0

                     mean       std
class                              
Iris-setosa         1.462  0.173664
Iris-versicolor     4.260  0.469911
Iris-virginica      5.552  0.551895
过滤

我们还可以使用 filter 函数对分组后的数据进行过滤操作。例如,我们可以筛选出 petal_length 的均值大于 5.5 的组,如下所示:

# 筛选出 petal_length 均值大于 5.5 的组
print(grouped.filter(lambda x: x['petal_length'].mean() > 5.5))

以上代码将会输出如下结果:

     sepal_length  sepal_width  petal_length  petal_width           class
100           6.3          3.3           6.0          2.5  Iris-virginica
101           5.8          2.7           5.1          1.9  Iris-virginica
102           7.1          3.0           5.9          2.1  Iris-virginica
103           6.3          2.9           5.6          1.8  Iris-virginica
104           6.5          3.0           5.8          2.2  Iris-virginica
转换

最后,我们还可以对分组后的数据进行转换操作。例如,我们可以将每组的数据减去每组的平均值,如下所示:

# 将每组的数据减去每组的平均值
transformed = grouped.transform(lambda x: x - x.mean())

# 打印转换后的数据
print(transformed.head())

以上代码将会输出如下结果:

   sepal_length  sepal_width  petal_length  petal_width
0        -0.146        0.066        -0.472       -0.046
1        -0.346       -0.234        -0.472       -0.046
2        -0.546       -0.034        -0.572       -0.046
3        -0.646       -0.134        -0.372       -0.046
4        -0.246        0.166        -0.472       -0.046