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
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
值。我们可以看到我们有一个新的数据框,它存储了所有的聚合值。
示例
现在我们将在原始数据框和这个数据框上进行一次“join”操作,以合并统计摘要信息。我们可以按如下方式进行:
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数据帧添加汇总统计信息作为新列的方法。我们看到了如何一次性添加单个和多个统计信息。您现在可以在您的项目和不同的应用中使用您刚学到的知识。