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

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

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

注意 − 本文中的代码在Jupyter Notebook上运行。

让我们从导入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是按dfname列进行分组操作返回的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
    姓名     学科    得分     最高分     最高分2     最高分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

输出

    姓名  最低分  最高分
Alice  65    92
Bob    76    91
Charlie 85   93

在这里,我们首先使用列’name’对’df’进行分组并聚合不同的最小值和最大值。我们可以看到我们有了一个新的存储所有聚合值的数据框。

示例

现在,我们将对我们的原始数据框和这个数据框执行’join’操作,以合并统计摘要。我们可以这样做–

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

输出

    姓名    学科     得分    最低分  最高分
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数据框中将摘要统计数据添加为新列的方法。我们看到了如何一次添加单个或多个统计值。现在您可以在项目和不同应用中使用您刚刚学到的内容。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程