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