如何有效地使用 Pandas GroupBy

如何有效地使用 Pandas GroupBy

源节点: 1941381

Pandas 是一个功能强大且广泛使用的开源库,用于使用 Python 进行数据操作和分析。 其主要功能之一是能够使用 groupby 函数对数据进行分组,方法是根据一列或多列将 DataFrame 分成几组,然后对每一列应用各种聚合函数。

 

如何有效地使用 Pandas GroupBy
图片来源: Unsplash
 

groupby 功能非常强大,因为它允许您快速汇总和分析大型数据集。 例如,您可以按特定列对数据集进行分组,并计算每组剩余列的平均值、总和或计数。 您还可以按多个列进行分组,以更详细地了解数据。 此外,它还允许您应用自定义聚合函数,这对于复杂的数据分析任务来说是一个非常强大的工具。

在本教程中,您将学习如何使用 Pandas 中的 groupby 函数对不同类型的数据进行分组并执行不同的聚合操作。 在本教程结束时,您应该能够使用此函数以各种方式分析和汇总数据。

当练习得好时,概念就会内化,这就是我们下一步要做的,即动手实践 Pandas groupby 函数。 建议使用 Jupyter笔记本 对于本教程,您可以看到每个步骤的输出。

生成样本数据

导入以下库:

  • Pandas:创建数据框并应用分组依据
  • 随机 – 生成随机数据
  • Pprint – 打印词典
import pandas as pd
import random
import pprint

 

接下来,我们将初始化一个空数据框并填充每列的值,如下所示:

df = pd.DataFrame()
names = [ "Sankepally", "Astitva", "Shagun", "SURAJ", "Amit", "RITAM", "Rishav", "Chandan", "Diganta", "Abhishek", "Arpit", "Salman", "Anup", "Santosh", "Richard",
] major = [ "Electrical Engineering", "Mechanical Engineering", "Electronic Engineering", "Computer Engineering", "Artificial Intelligence", "Biotechnology",
] yr_adm = random.sample(list(range(2018, 2023)) * 100, 15)
marks = random.sample(range(40, 101), 15)
num_add_sbj = random.sample(list(range(2)) * 100, 15) df["St_Name"] = names
df["Major"] = random.sample(major * 100, 15)
df["yr_adm"] = yr_adm
df["Marks"] = marks
df["num_add_sbj"] = num_add_sbj
df.head()

 

额外提示 - 完成相同任务的一种更简洁的方法是创建所有变量和值的字典,然后将其转换为数据帧。

student_dict = { "St_Name": [ "Sankepally", "Astitva", "Shagun", "SURAJ", "Amit", "RITAM", "Rishav", "Chandan", "Diganta", "Abhishek", "Arpit", "Salman", "Anup", "Santosh", "Richard", ], "Major": random.sample( [ "Electrical Engineering", "Mechanical Engineering", "Electronic Engineering", "Computer Engineering", "Artificial Intelligence", "Biotechnology", ] * 100, 15, ), "Year_adm": random.sample(list(range(2018, 2023)) * 100, 15), "Marks": random.sample(range(40, 101), 15), "num_add_sbj": random.sample(list(range(2)) * 100, 15),
}
df = pd.DataFrame(student_dict)
df.head()

 

数据框如下所示。 运行此代码时,某些值将不匹配,因为我们使用的是随机样本。

 

如何有效地使用 Pandas GroupBy

分组

让我们按“主要”主题对数据进行分组,并应用组过滤器来查看有多少记录属于该组。

groups = df.groupby('Major')
groups.get_group('Electrical Engineering')

 

因此,有四名学生属于电气工程专业。

 

如何有效地使用 Pandas GroupBy
 

您还可以按多列进行分组(本例中为 Major 和 num_add_sbj)。 

groups = df.groupby(['Major', 'num_add_sbj'])

 

请注意,所有可应用于具有一列的组的聚合函数都可以应用于具有多列的组。 在本教程的其余部分中,我们以单列为例重点介绍不同类型的聚合。

让我们在“Major”列上使用 groupby 创建组。

groups = df.groupby('Major')

应用直接函数

假设您想找到每个专业的平均分。 你会怎么办? 

  • 选择标记栏
  • 应用均值函数
  • 应用舍入函数将标记四舍五入到小数点后两位(可选)
groups['Marks'].mean().round(2)

 

Major
Artificial Intelligence 63.6
Computer Engineering 45.5
Electrical Engineering 71.0
Electronic Engineering 92.0
Mechanical Engineering 64.5
Name: Marks, dtype: float64

 

骨料

实现相同结果的另一种方法是使用聚合函数,如下所示:

groups['Marks'].aggregate('mean').round(2)

 

您还可以通过将函数作为字符串列表传递来将多个聚合应用于组。

groups['Marks'].aggregate(['mean', 'median', 'std']).round(2)

 

如何有效地使用 Pandas GroupBy
 

但是如果您需要将不同的函数应用于不同的列该怎么办? 不用担心。 您还可以通过传递 {column: function} 对来做到这一点。

groups.aggregate({'Year_adm': 'median', 'Marks': 'mean'})

 

如何有效地使用 Pandas GroupBy

变换

您可能非常需要对特定列执行自定义转换,这可以使用 groupby() 轻松实现。 让我们定义一个与 sklearn 预处理模块中可用的标准标量类似的标准标量。 您可以通过调用转换方法并传递自定义函数来转换所有列。

def standard_scalar(x): return (x - x.mean())/x.std()
groups.transform(standard_scalar)

 

如何有效地使用 Pandas GroupBy
 

请注意,“NaN”表示标准差为零的组。

筛选器

您可能想检查哪个“专业”表现不佳,即平均学生“分数”低于 60 分的专业。它要求您对内部有函数的组应用过滤方法。 下面的代码使用了 拉姆达函数 以达到过滤后的结果。

groups.filter(lambda x: x['Marks'].mean() 60)

 

如何有效地使用 Pandas GroupBy

姓氏:

它为您提供按索引排序的第一个实例。

groups.first()

 

如何有效地使用 Pandas GroupBy

描述

“describe”方法返回给定列的基本统计信息,例如计数、平均值、标准差、最小值、最大值等。

groups['Marks'].describe()

 

如何有效地使用 Pandas GroupBy

尺寸

Size,顾名思义,以记录数的形式返回每个组的大小。

groups.size()

 

Major
Artificial Intelligence 5
Computer Engineering 2
Electrical Engineering 4
Electronic Engineering 2
Mechanical Engineering 2
dtype: int64

计数和努尼克

“Count”返回所有值,而“Nunique”仅返回该组中的唯一值。

groups.count()

 

如何有效地使用 Pandas GroupBy

 

groups.nunique()

 

如何有效地使用 Pandas GroupBy

重命名

您还可以根据您的喜好重命名聚合列的名称。

groups.aggregate("median").rename( columns={ "yr_adm": "median year of admission", "num_add_sbj": "median additional subject count", }
)

 

如何有效地使用 Pandas GroupBy
 

  • 明确 groupby 的目的: 您是否试图按一列对数据进行分组以获得另一列的平均值? 或者您是否尝试按多列对数据进行分组以获取每组中的行数?
  • 了解数据框的索引: groupby 函数使用索引对数据进行分组。 如果要按列对数据进行分组,请确保将该列设置为索引,或者可以使用 .set_index()
  • 使用适当的聚合函数:它可以与各种聚合函数一起使用,例如mean()、sum()、count()、min()、max()
  • 使用 as_index 参数: 当设置为 False 时,此参数告诉 pandas 使用分组列作为常规列而不是索引。

您还可以将 groupby() 与其他 pandas 函数(例如pivot_table()、crosstab() 和 cut())结合使用,从数据中提取更多见解。

groupby 函数是一种强大的数据分析和操作工具,因为它允许您根据一列或多列对数据行进行分组,然后对组执行聚合计算。 本教程借助代码示例演示了使用 groupby 函数的各种方法。 希望它能让您了解它附带的不同选项以及它们如何帮助数据分析。

 
 
维迪·楚(Vidhi Chugh) 是一名 AI 战略家和数字转型领导者,致力于产品、科学和工程的交叉领域,以构建可扩展的机器学习系统。 她是屡获殊荣的创新领袖、作家和国际演说家。 她的使命是使机器学习民主化并打破行话,让每个人都成为这一转变的一部分。
 

时间戳记:

更多来自 掘金队