如何在 Pandas 中添加组级汇总统计数据作为新列?

pandasserver side programmingprogramming更新于 2025/6/4 3:52:17

Pandas 是一个非常流行的数据处理库,经常用于数据操作和分析。Pandas 库提供了强大的分析功能,例如分组来分析具有一些共同特征的各种样本。在本文中,我们将学习如何将通过样本组获得的这些汇总统计数据作为新列添加到我们现有的 Pandas 数据框中。

注意 - 本文中的代码是在 jupyter 笔记本上运行的。

让我们从导入 Pandas 开始。

import pandas as pd

示例

以下是我们将要处理的示例数据集。它有 3 列,分别存储学生姓名、科目名称和学生在该科目的相应分数。我们将找出每个学生成绩的各种统计数据。

data = {'name': ['Alice', 'Alice', 'Alice', 'Alice', 'Bob', 'Bob', 'Bob',
   'Bob', 'Charlie', 'Charlie', 'Charlie', 'Charlie'],
   'subject': ['English', 'Science', 'Maths', 'History', 'English',
   'Science', 'Maths', 'History', 'English', 'Science', 'Maths', 'History'],
   'score': [87, 92, 78, 65, 76, 89, 91, 81, 90, 85, 88, 93]}
df = pd.DataFrame(data)
df

输出

   name    subject   score
0  Alice   English    87
1  Alice   Science    92
2  Alice   Maths      78
3  Alice  History     65
4  Bob    English     76
5  Bob    Science     89
6  Bob    Maths       91
7  Bob    History     81
8 Charlie  English    90
9 Charlie  Science    85
10 Charlie  Maths     88
11 Charlie  History   93

我们首先根据学生姓名对数据集进行分组,如下所示。

df_grp_name = df.groupby('name')
df_grp_name
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000019F5C3889D0>

这里的 `df_grp_name` 是我们对 `df` 的 `name` 列进行分组操作后返回的 pandas.DataFrame.groupby 对象。现在我们将添加一个新列来存储每个学生的最高分数,如下所示。

df['max_score'] = df_grp_name['score'].transform('max')
df
   name   subject   score   max_score
0  Alice   English   87      92
1  Alice   Science   92      92
2  Alice   Maths     78      92
3  Alice  History    65      92
4  Bob    English    76      91
5  Bob    Science    89      91
6  Bob     Maths     91      91
7  Bob    History    81      91
8 Charlie  English   90      93
9 Charlie  Science   85      93
10 Charlie  Maths    88      93
11 Charlie History   93      93

在这里,我们首先访问数据框的"score"列并应用"max"转换。

示例

我们也可以在一行中完成整个操作,如下所示 -

df['max_score_2'] = df.groupby('name')['score'].transform('max')
df

输出

    name     subject    score   max_score  max_score_2
0   Alice    English     87        92         92
1   Alice    Science     92        92         92
2   Alice    Maths       78        92         92
3   Alice    History     65        92         92
4    Bob     English     76        91         91
5    Bob     Science     89        91         91
6    Bob      Maths      91        91         91
7    Bob     History     81        91         91
8  Charlie  English      90        93         93
9  Charlie  Science      85        93         93
10 Charlie  Maths        88        93         93
11 Charlie  History      93        93         93

注意 − 我们还可以使用如下所示的点符号访问列。

df['max_score_3'] = df.groupby('name').score.transform('max')
df
    name     subject    score   max_score  max_score_2  max_score_3
0   Alice    English     87        92         92           92                 
1   Alice    Science     92        92         92           92
2   Alice    Maths       78        92         92           92
3   Alice    History     65        92         92           92
4    Bob     English     76        91         91           91
5    Bob     Science     89        91         91           91
6    Bob      Maths      91        91         91           91
7    Bob     History     81        91         91           91
8  Charlie  English      90        93         93           93
9  Charlie  Science      85        93         93           93
10 Charlie  Maths        88        93         93           93
11 Charlie  History      93        93         93           93

示例

以上是添加单个或几个统计值的好方法。但是,它很快就会变得乏味,所以让我们看看如何一次性添加多个统计数据!现在让我们重新创建原始数据集。

df = pd.DataFrame(data)

让我们找出我们想要查找的不同统计值,如下所示。

df_agg = df.groupby(['name'])['score'].agg([min, max])
df_agg

输出

name  min  max
Alice  65   92
Bob    76   91
Charlie 85  93

在这里,我们首先按列"name"对"df"进行分组,并聚合不同的"min"和"max"值。我们可以看到我们有一个新的数据框,它存储了所有聚合值。

示例

现在我们将对原始数据框和此数据框执行"连接"操作,以合并统计摘要。我们可以按如下方式执行 -

df = pd.merge(df, df_agg, on='name', how='left')
df

输出

    name   subject   score   min  max
0   Alice  English    87     65   92
1   Alice  Science    92     65   92
2   Alice   Maths     78     65   92
3   Alice  History    65     65   92
4    Bob   English    76     76   91
5    Bob   Science    89     76   91
6    Bob    Maths     91     76   91
7    Bob   History    81     76   91
8  Charlie  English   90     85   93
9  Charlie  Science   85     85   93
10 Charlie   Maths    88     85   93
11 Charlie  History   93     85   93

这里我们使用了 Pandas `merge` 方法,并且我们在列 `name` 上进行连接(即根据此列匹配行),并且我们将连接类型指定为左连接。

结论

本文教了我们几种将汇总统计数据作为新列添加到 Pandas 数据框的方法。我们了解了如何一次性添加单个和多个统计数据。您现在可以在项目和不同的应用程序中使用刚刚学到的知识。


相关文章