Skip to content

Latest commit

 

History

History
333 lines (231 loc) · 10.6 KB

effectively-pandas-groupby.md

File metadata and controls

333 lines (231 loc) · 10.6 KB

如何有效使用 Pandas GroupBy

原文:www.kdnuggets.com/2023/01/effectively-pandas-groupby.html

Pandas 是一个功能强大且广泛使用的开源库,用于使用 Python 进行数据操作和分析。它的一个关键特性是能够使用 groupby 函数通过基于一个或多个列将数据框分成组,然后对每个组应用各种聚合函数。

如何有效使用 Pandas GroupBy

图片来自 Unsplash


我们的前三个课程推荐

1. Google 网络安全证书 - 快速进入网络安全职业生涯

2. Google 数据分析专业证书 - 提升你的数据分析技能

3. Google IT 支持专业证书 - 支持你的组织进行 IT 维护


groupby 函数非常强大,因为它允许你快速总结和分析大数据集。例如,你可以根据特定列对数据集进行分组,并计算每个组中剩余列的均值、总和或计数。你还可以通过多个列进行分组,以获得对数据的更详细理解。此外,它还允许你应用自定义聚合函数,这对于复杂的数据分析任务是一个非常强大的工具。

在本教程中,你将学习如何使用 Pandas 的 groupby 函数来对不同类型的数据进行分组并执行不同的聚合操作。通过本教程,你应该能够使用这个函数以多种方式分析和总结数据。

实践代码示例

当概念经过充分练习后就会内化,这也是我们接下来要做的,即实际操作 Pandas 的 groupby 函数。建议使用 Jupyter Notebook 来完成本教程,因为你可以在每一步查看输出结果。

生成示例数据

导入以下库:

  • Pandas: 创建数据框并应用分组

  • Random - 用于生成随机数据

  • 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

创建分组

让我们按“Major”科目分组数据,并应用组过滤以查看有多少记录落入此组。

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')

应用直接函数

假设你想找到每个 Major 的平均分数。你会怎么做?

  • 选择 Marks 列

  • 应用均值函数

  • 应用round函数将成绩四舍五入到两位小数(可选)

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 的预处理模块中的标准缩放器。你可以通过调用transform方法并传递自定义函数来变换所有列。

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

如何有效使用 Pandas GroupBy

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

过滤

你可能想检查哪个“Major”表现不佳,即平均“Marks”低于 60 的那个。这需要你对组应用一个带有函数的过滤方法。下面的代码使用一个 lambda 函数来实现过滤结果。

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 的目的: 你是想通过一列对数据进行分组,以获取另一列的均值?还是通过多列对数据进行分组,以获取每组中的行数?

  • 了解数据框的索引: groupby 函数使用索引来分组数据。如果你想通过某列对数据进行分组,确保该列被设置为索引,或者可以使用.set_index()

  • 使用适当的聚合函数:可以与各种聚合函数一起使用,如 mean()、sum()、count()、min()、max()。

  • 使用 as_index 参数: 当设置为 False 时,此参数告诉 pandas 将分组列用作常规列而不是索引。

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

摘要

groupby 函数是数据分析和处理的强大工具,因为它允许你根据一个或多个列对数据行进行分组,然后对这些组执行聚合计算。教程展示了如何通过代码示例使用 groupby 函数的各种方法。希望它能帮助你理解这些选项及其在数据分析中的作用。

Vidhi Chugh 是一位人工智能策略师和数字化转型领导者,她在产品、科学和工程交汇处工作,致力于构建可扩展的机器学习系统。她是一位获奖的创新领导者、作者和国际演讲者。她的使命是使机器学习民主化,并打破行话,让每个人都能参与这场变革。

了解更多相关话题