📅  最后修改于: 2023-12-03 15:09:36.485000             🧑  作者: Mango
在 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