Skip to content

Files

Latest commit

2a696cf · Sep 14, 2024

History

History
221 lines (139 loc) · 8.19 KB

set-operations-applied-pandas-dataframes.md

File metadata and controls

221 lines (139 loc) · 8.19 KB

应用于 Pandas DataFrames 的集合操作

原文:www.kdnuggets.com/2019/11/set-operations-applied-pandas-dataframes.html

评论

Eduardo Corrêa Gonçalves,ENCE/IBGE

介绍

在某些实际情况中,将 pandas DataFrame 视为一个 数学集合 可能是有趣的。在这种情况下,DataFrame 的每一行可以被视为集合的 元素成员


我们的前三名课程推荐

1. Google 网络安全证书 - 快速进入网络安全职业轨道。

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

3. Google IT 支持专业证书 - 支持你的组织的 IT


那么问题变成了:为什么这会有用?答案是这样的。正如我们所知,数据科学问题通常需要分析来自多个来源的数据。在数据分析过程中,你可能会遇到需要比较两个或多个 DataFrames 的内容,以确定它们是否有共同的元素(行)的问题。在本教程中,你将学习集合操作是执行此类任务的最佳和最自然的技术之一。

实际示例

假设你有两个 DataFrames,分别命名为 P 和 S,它们分别包含注册了 SQL 和 Python 两门不同课程的学生的姓名和电子邮件。

图示图示

考虑你需要回答以下问题:

  1. 这两个 DataFrames 中有多少不同的学生?

  2. 是否有学生同时注册了 Python 和 SQL 课程?

  3. 哪些学生在上 Python 课程,但没有上 SQL 课程(反之亦然)?

如果将 DataFrames 视为两个不同的数学集合,答案可以通过简单的方式获得。然后,你只需要应用基本的 并集交集差集 操作:

P ∪ S,即 P 和 S 的并集,是在 P 或 S 或两者中都存在的元素的集合。注意元素(学生)Elizabeth 在结果中只出现一次。

图示

P ∩ S,即 P 和 S 的交集,是既在 P 中又在 S 中的元素的集合。现在,只有 Elizabeth 出现,因为她是两个集合中的唯一一个。

图示

P − S,即 P 和 S 的差集,是包含所有在 P 中但不在 S 中的元素的集合:

图示

请注意,S − P 与 P − S 是不同的:

图示

重要的是要指出,对这些操作应用的 DataFrames 必须具有相同的属性(如示例中所示)。

Pandas 中的集合操作

尽管 pandas 没有提供专门的集合操作方法,但我们可以通过以下方法轻松模拟这些操作:

  • 并集:concat() + drop_duplicates()

  • 交集:merge()

  • 差集:isin() + 布尔索引

在下面的程序中,我们演示了如何做到这一点。代码列表后给出了详细的解释。

结果如下所示:

------------------------------
all students (UNION):
        name                 email
0  Elizabeth        bennet@xyz.com
1      Darcy  darcy@acmecorpus.com
2    Bingley       bingley@xyz.com
------------------------------
Students enrolled in both courses (INTERSECTION):
        name           email
0  Elizabeth  bennet@xyz.com
------------------------------
Python students who are not taking SQL (DIFFERENCE):
    name                 email
1  Darcy  darcy@acmecorpus.com
------------------------------
SQL students who are not taking Python (DIFFERENCE):
      name            email
0  Bingley  bingley@xyz.com

这是对代码的完整解释。最初,我们创建了两个 DataFrame,P(Python 学生)和 S(SQL 学生)。创建完成后,它们被提交给程序的第二部分中的三种集合操作。

并集

为了执行并集操作,我们应用了两个方法:concat() 然后是 drop_duplicates()。第一个方法实现数据的连接,即将一个 DataFrame 的行放在另一个 DataFrame 的行下方。因此,以下语句:

all_students = pd.concat([P, S], ignore_index = True) 

生成一个由 4 行组成的 DataFrame(P 中 2 行加上 S 中 2 行)。

        name                 email
0  Elizabeth        bennet@xyz.com
1      Darcy  darcy@acmecorpus.com
2    Bingley       bingley@xyz.com
3  Elizabeth        bennet@xyz.com

然而,请注意,有两行指的是 Elizabeth,因为她是唯一一个同时注册了两个课程的学生。为了只保留一个该元素的出现,只需使用 drop_duplicates() 方法:

all_students = all_students.drop_duplicates() 
        name                 email
0  Elizabeth        bennet@xyz.com
1      Darcy  darcy@acmecorpus.com
2    Bingley       bingley@xyz.com

交集

多功能的 merge() 方法被用来执行交集操作。该方法可以用来以不同的方式组合或连接 DataFrame。然而,当在涉及两个兼容 DataFrame 的操作中未指定任何参数时,它会生成它们的交集:

sql_and_python = P.merge(S)
        name           email
0  Elizabeth  bennet@xyz.com

差集

差集操作的代码稍微复杂一些。如我们所知,两集合 P 和 S 之间的差集是一个旨在确定 P 中不属于 S 的元素的操作。在 pandas 中,我们可以使用isin()方法结合布尔索引来实现这一操作:

python_only = P[P.email.isin(S.email) == False]

为了说明这一点,我们将其分为两部分。第一部分是:

P.email.isin(S.email)

上述命令生成一个布尔结构,指出 DataFrame P 中哪些电子邮件存在于 S 中:

0     True
1    False

这个布尔结构随后用于过滤 P 中的行:

python_only = P[P.email.isin(S.email) == False]
    name                 email
1  Darcy  darcy@acmecorpus.com

获取未学习 Python 的 SQL 学生是类似的操作:

sql_only = S[S.email.isin(P.email) == False]
      name            email
0  Bingley  bingley@xyz.com

参考文献/进一步阅读

Pandas 文档

pandas.pydata.org/pandas-docs/stable/

斯坦福哲学百科全书 - 基本集合论

plato.stanford.edu/entries/set-theory/basic-set-theory.html

詹妮弗·维多姆 - 关系代数 2 第一部分

www.youtube.com/watch?v=r_h9yBnNh0U

个人简介: Eduardo Corrêa Gonçalves 在巴西地理与统计研究所(IBGE)担任数据库管理员,并在国家统计科学学院(ENCE/IBGE)担任助理教授。他参与了不同经济和农业调查的数据库建模和实施的各个阶段,例如:“企业中央登记统计”、“市级牲畜统计”和“农业生产系统调查”。他的研究、教学和专业活动集中在算法、人工智能和数据库领域。

相关内容:

  • 5 个 Pandas 高级功能及其使用方法

  • 了解你的数据:第一部分

  • 25 个 Pandas 小技巧

相关话题更多内容