如何在 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` 是一个 pandas.DataFrame.groupby 对象,由我们在 `df` 的 `name` 列上进行的分组操作返回。现在我们将添加一个新列来存储每个学生的最高分,如下所示。
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 数据框中的方法。我们看到了如何添加单个统计信息以及如何一次添加多个统计信息。您现在可以在您的项目和不同的应用程序中使用您刚刚学到的知识。
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP