使用这三种有用的技术掌握 Pandas 的数据转换

深入研究过滤、操纵和运作

照片由 米拉德·法库里安 on Unsplash

回想一下您上次使用格式良好的数据集的情况。命名良好的列、最少的缺失值和正确的组织。拥有不需要清理和转换的数据是一种很好的感觉,几乎是一种自由。

好吧,这很好,直到你从白日梦中清醒过来,继续摆弄面前那一团乱七八糟的破行和无意义的标签。

不存在所谓的干净数据(原始形式)。如果您是数据科学家,您就会知道这一点。如果你刚刚开始,你应该接受这一点。您需要转换数据才能有效地使用它。

让我们谈谈三种方法。

过滤——但解释正确

我们来谈谈过滤——但比你习惯做的更深入一些。作为最常见和最有用的数据转换操作之一,有效过滤是任何数据科学家的必备技能。如果您了解 Pandas,这可能是您学会的第一个操作之一。

让我们回顾一下,使用我最喜欢的、奇怪的多功能示例:学生成绩的 DataFrame,恰当地称为 grades:

作者图片

我们将过滤掉所有低于 90 分的分数,因为在这一天,我们决定成为训练有素的教育工作者,只迎合最优秀的学生(请不要真正这样做)。完成此操作的标准代码行如下:

成绩[成绩['分数'] >= 90]
作者图片

剩下的就是杰克和赫敏了。凉爽的。但这里究竟发生了什么? 为什么 上面这行代码有效吗?让我们通过查看上面外括号内的表达式的输出来更深入地了解一下:

成绩['分数'] >= 90
作者图片

啊好吧。这就说得通了。这行代码似乎返回一个 Pandas Series 对象,其中包含 Boolean ( True / False )值由什么决定 >= 90 为每个单独的行返回。这是关键的中间步骤。之后,这一系列布尔值被传递到外括号中,并相应地过滤所有行。

为了完整起见,我还将提到使用以下方法可以实现相同的行为 loc 关键词:

Grades.loc[成绩['分数'] >= 90]
作者图片

我们可能选择使用的原因有很多 loc (其中之一是它实际上允许我们通过单个操作过滤行和列),但这打开了熊猫操作的潘多拉魔盒,最好留给另一篇文章。

目前,重要的学习目标是:当我们过滤 Pandas 时,令人困惑的语法并不是某种奇怪的魔法。我们只需将其分解为两个组成步骤:1)获取满足条件的行的布尔系列,2)使用该系列过滤整个 DataFrame。

您可能会问,为什么这有用?嗯,一般来说,如果您只是使用操作而不了解它们的实际工作原理,则可能会导致令人困惑的错误。过滤是一种有用且非常常见的操作,您现在知道它是如何工作的。

让我们继续前进。

Lambda 函数的美妙之处

有时,您的数据需要的转换根本不是 Pandas 功能内置的。尽管你尽了最大的努力,但无论在 Stack Overflow 上搜索多少次,或者仔细研究 Pandas 文档,也无法找到解决你问题的方法。

输入 lambda 函数——这是一种有用的语言功能,可以与 Pandas 完美集成。

快速回顾一下 lambda 的工作原理如下:

>>> add_function = lambda x, y: x + y
>>> 添加函数(2, 3)
5

Lambda 函数与常规函数没有什么不同,只是它们具有更简洁的语法:

  • 等号左边的函数名
  • lambda 等号右侧的关键字(类似于 def 传统 Python 函数定义中的关键字,这让 Python 知道我们正在定义一个函数)。
  • 后面的参数 lambda 关键字,位于冒号左侧。
  • 返回冒号右侧的值。

现在,让我们将 lambda 函数应用到实际情况中。

数据集通常有自己的格式怪癖,特定于数据输入和收集的变化。因此,您正在处理的数据可能存在需要解决的奇怪的具体问题。例如,考虑下面的简单数据集,它存储人们的姓名及其收入​​。我们就这样称呼它吧 monies.

作者图片

现在,作为这家公司的主数据殿下,我们得到了一些绝密信息:这家公司的每个人都将获得 10% 的加薪,外加 1000 美元。这可能是一种过于具体的计算,无法找到具体的方法,但使用 lambda 函数就足够简单了:

update_venue = lambda num: num + (num * .10) + 1000

然后,我们需要做的就是在 Pandas 中使用这个函数 apply 函数,它允许我们将函数应用于所选系列的每个元素:

monies['新收入'] = monies['收入'].apply(update_venue)
作者图片

我们就完成了!一个出色的新数据框架,包含我们所需的信息,全部包含在两行代码中。为了使其更加简洁,我们甚至可以在内部定义 lambda 函数 apply 直接——这是一个值得牢记的很酷的提示。

我将在这里简单地阐述这一点。

Lambda 非常有用,因此您应该使用它们。享受!

系列字符串操作函数

在上一节中,我们讨论了 lambda 函数的多功能性以及它们可以帮助您完成数据处理的所有很酷的事情。这是极好的, 但是 你应该小心,不要得意忘形。过于沉迷于一种熟悉的做事方式而错过了 Python 为程序员提供的更简单的快捷方式是非常常见的。当然,这不仅仅适用于 lambda,但我们暂时坚持这一点。

例如,假设我们有以下 DataFrame 名为 names 它存储人们的名字和姓氏:

作者图片

现在,由于我们数据库的空间限制,我们决定不存储一个人的整个姓氏,而是简单地存储他们最后的名字首字母更有效。因此,我们需要改造 'Last Name' 列相应。对于 lambda,我们的尝试可能如下所示:

名称['姓氏'] = 名称['姓氏'].apply(lambda s: s[:1])
名称
作者图片

这显然是有效的,但它有点笨拙,因此不像它应该的那样 Pythonic。幸运的是,凭借 Pandas 中字符串操作函数的美妙之处,还有另一种更优雅的方法(出于下一行代码的目的,假设我们还没有改变 'Last Name' 包含上述代码的列):

名称['姓氏'] = 名称['姓氏'].str[:1]
名称
作者图片

哒哒!这 .str Pandas Series 的属性允许我们使用指定的字符串操作来拼接该系列中的每个字符串,就像我们单独处理每个字符串一样。

但等等,情况会变得更好。自从 .str 有效地让我们通过系列访问字符串的正常功能,我们还可以应用一系列字符串函数来帮助快速处理我们的数据!例如,假设我们决定将两列都转换为小写。下面的代码完成了这个工作:

名称['名字'] = 名称['名字'].str.lower()
名称['姓氏'] = 名称['姓氏'].str.lower()
名称
作者图片

这比定义自己的 lambda 函数并调用其中的字符串函数的麻烦要简单得多。并不是说我不喜欢 lambda,但一切都有其自己的位置,并且简单性在 Python 中应该始终是优先考虑的。

我在这里只介绍了几个例子,但是 大量字符串函数可供您使用 [1]。

自由地使用它们。他们很优秀。

最后的想法和回顾

这是给您的一些数据转换备忘单:

  1. 按照您的意思过滤。了解到底发生了什么,这样您就知道自己在做什么。
  2. 喜欢你的 lambda。它们可以帮助您以惊人的方式操纵数据。
  3. 熊猫和你一样喜欢绳子。有很多内置功能 - 您不妨使用它们。

这是最后一条建议:没有“正确”的方法来过滤数据集。这取决于手头的数据以及您想要解决的独特问题。然而,虽然没有每次都可以遵循的固定方法,但有一些有用的工具值得您使用。在这篇文章中,我讨论了其中的三个。

我鼓励你出去寻找更多。

参考资料

[1] https://www.aboutdatablog.com/post/10-most-useful-string-functions-in-pandas

使用这三种有用的技术在 Pandas 中进行主数据转换从来源重新发布 https://towardsdatascience.com/master-data-transformation-in-pandas-with-these- Three-useful-techniques-20699f03e51d?source=rss—-7f60cf5620c9— 4 通过 https://towardsdatascience.com/feed

–>

时间戳记:

更多来自 区块链顾问