学习日记|Day 16:如何在 Python 中清理数据
00 分钟
2023-5-7
2023-8-26
type
status
slug
summary
date
tags
category
password
Text
AI summary
AI custom autofill
Multi-select
Status
URL
hashtag
勘误
标签
标题
类型
贴文
🪄
icon
 
本文介绍了如何使用 Python 清理数据,使用 Netflix 电视节目和电影数据集作为数据样本。作者详细阐述了在数据清理和整理过程中需要注意的一些问题,包括如何查看数据、检查缺失值、处理缺失值、检查数据类型等等。文章还引用了一些图片来帮助读者更好地理解,例如数据集中的缺失值分布图。如果您正在进行数据分析或处理,这篇文章可能会对您有所帮助。
此外,作者还分享了自己的学习经历,指出在课程中从未处理过“混乱的数据”给个人项目带来的障碍。如果您也遇到了类似的问题,这篇文章可以作为您学习如何有效清理数据的起点。
 

 
当我参加我学院的定向阅读计划(一个由研究生指导本科生的小型研究计划)时,我只在 R 课程中学习了 2 个统计数据。虽然这些课程教会了我很多关于如何操作数据、创建数据可视化和提取分析的知识,但在该计划中从事我的第一个个人项目让我意识到我从未处理过“混乱的数据”。这些课程涉及预先清理和处理的数据集,但没有教学生如何清理数据集,这对开始个人项目造成了障碍因此,我希望这篇文章可以作为您学习如何有效清理数据的起点,启动您的个人项目。
在本文中,我将使用Netflix 电视节目和电影数据集,其中包含许多不一致和缺失的数据。

第 一 步:查看您的数据

在对数据集执行任何清理或操作之前,您应该瞥一眼数据以了解您正在使用哪些变量,值是如何根据它们所在的列构建的,也许您可以粗略地了解一下您需要解决的不一致的想法,否则它们在分析阶段会很麻烦。在这里,您可能还可以删除某些不需要的列,具体取决于您要执行的分析。

1. 打印数据集的前几行

在这里,我打印了数据集的前 7 行,但您可以打印 5 行或 10 行。我建议将它保持在小于 10 的任何值,否则对于您当前尝试做的事情来说太过分了——快速浏览的数据集。
notion image
这样做会让您很好地了解您可能正在处理的数据类型、需要执行转换或清理的列以及您可能能够提取的其他数据。
在我们更仔细地研究之前,让我们执行下一步。

2.将变量保存到列表中

您希望这样做是为了轻松访问数据集的不同列,尤其是当您希望对列的不同子集执行相同的转换时。

3. 在每一栏中记下您必须解决的潜在问题。

为了保持井井有条,请记下您在数据集中看到的问题(通过像步骤 1 中那样瞥一眼您的数据集)。
notion image
上面这张图片代表了我仅通过瞥见数据集就可以看到的内容,这是您在查看数据集时应该考虑的事情以下是一些让我印象深刻的事情:
  • 有些列缺少值。如果不在过程的早期解决和解决,这可能会导致很多分析和绘图问题。
  • 有包含单词和数字的列,例如date_addedduration制作时间序列图,或者用其他图表来探索持续时间与其他变量的关系,这可能会成为一个问题。和如果我们想按日期
  • 有 2 列,多个不同的词用逗号连接在一起。如果我们想制作探索Netflix 上(类型)或演员分布的情节,这就是一个问题。listed_in
  • 其他列可能有缺失值。下一步着眼于检查哪些列有缺失值它们有多少缺失数据的方法。
以及其他列可能有缺失值。下一步着眼于检查哪些列有缺失值它们有多少缺失数据的方法。

第二步:看缺失数据的比例

从这个代码块中,您可以轻松地查看数据集中缺失值的分布,从而很好地了解您需要使用哪些列来解决缺失值问题。
从输出中,您可以收集以下见解:
  • director列的缺失数据百分比最高 ~ 30%
  • castcountry和列也有相当大比例的缺失数据~9%
  • date_added, ratingduration并且没有那么多缺失数据 ~ 0% - 0.1%
  • 幸运的是,大多数其他列都不是空的。
您的下一个问题可能是,如何处理这些包含缺失值的列?
有几种方法可以处理它:
  1. 完全放下该列。如果该列对您的分析不是那么重要,则将其删除。
  1. 保留专栏。在这种情况下,因为director, castcountry列对我的分析非常重要,所以我将保留它们
  1. 插补——用替换值替换缺失数据的过程。
    1. 在这里,这样做是不可能的,因为大多数数据是字符串值而不是数值。但是,我将写一篇文章,详细讨论插补,为什么和什么时候应该使用它,以及如何在一些包的帮助下在 R 和 Python 中使用它。
在继续之前,我将提出跨行缺失值的问题。
在某些情况下,您可能想要检查缺失值在数据集所有行中的分布(假设您的数据集没有大量的观察值/行)。在这里,您可以根据行对您的分析的重要性从上述选项中进行选择例如,您的数据集包含随时间变化的事物的记录数据。即使一行可能包含缺失值,您也可能不想消除它,因为您想要保留重要的时间信息。
让我们继续第 3 步,然后再向您展示如何在保留列后处理 NaN 值。

第三步:查看每一列的数据类型

在这里,您可以看到所有列的object数据类型都为release_year在 pandas 中,对象表示字符串或混合类型(数字和非数字类型混合)。从我们的数据集中,您将能够分辨出哪些列是严格的字符串和混合类型。

第 四 步:如果您有字符串列,请检查尾随空格

 
在我们知道我们正在处理的数据类型之后,让我们确保使用删除任何尾随字符和空格strip

第 五 步:处理缺失值(NaN 值)

回到缺失值的列,让我们看一下列:director, cast, country, date_added, rating, duration我们可以根据它们是字符串还是混合类型来对这些列进行分割。
字符串:(director, cast, country, rating这里是字符串,不混合,因为数值分开了就没有意义了)
混合:date_added, duration
NaN在熊猫中表示不是数字。它是一个特殊的浮点值,不同于NoneTypePython。NaN使用这些值可能会很烦人,尤其是当您想将它们过滤掉以进行绘图或分析时。为了让我们的生活更轻松,让我们用其他东西替换这些 NaN 值。
对于字符串类型的值,我们可以将NaN值替换为“”或“None”或任何可以向您指示该条目中没有任何值的字符串。在这里,我选择使用fillna函数将其替换为“”。因为它不是就地函数,所以我将更改后的值重新分配给数据集中的列。
在这里,您一定已经注意到我省略了持续时间列。这是因为我们稍后会对该专栏进行一些处理。

第 六 步:看看有没有其他的变量可以通过抽取其他变量得到

对于混合类型的值,在我们解决缺失值问题之前,让我们看看是否可以提取任何数据以使我们的分析更丰富或过程更容易。
notion image
查看date_added,我们可以看到它包含添加电影/节目的月份、日期和年份。与其将所有这些信息放在一栏中,不如尝试将它们分开?这样,我们就可以选择隔离月份或年份与其他变量的交互方式,而不是查看date_added其粒度在何处会导致难以发现任何趋势。
下面,我编写了代码,不仅将信息分成另外 2 列,而且还过滤掉具有值的行NaN并将它们替换为 0,就像之前对“”所做的一样。
notion image
现在,新数据集包含month_addedyear_added列。这将允许我们稍后进行一些趋势分析。
查看duration,除了它是混合类型之外,该列中还有 2 个不同的时间单位。这是一个问题,因为我们正在处理两种不同类型的内容,它们的时间测量方式不同。duration因此,如果我们保持原样,制作图表将很难解释。好消息是有很多方法可以解决这个问题。我选择的处理方式是将内容类型分成 2 个不同的数据集,自然地,持续时间列将只是数字,并且只有一种时间单位。这样,您可以使用这些值轻松清晰地进行绘图。
因为该duration列同时包含字符串和数字,所以我还必须创建一个函数来从该列中提取数字,以便可以将其插入到 2 个新数据集的列中。

第 七 步:检查列的唯一值

除了可能缺失的值外,执行分析后可能会遇到损坏的值。要检查这一点,我们可以检查某些列的唯一值。让我们参考数据集的前 5 行作为我们的起点。
notion image
notion image
检查所有列的唯一值可能不是战略性的,尤其是标题、导演和演员表,因为可能有大量的唯一值要检查。相反,让我们关注一个潜在的唯一值列表,这些值可能更容易检查并且更重要,因为它可能对未来的分析更有洞察力。从数据集中一瞥,列country, rating, listed_in可能是感兴趣的列。让我们首先检查评级列,因为这似乎是处理起来最简单的列。
您可以使用 Python 的内置函数轻松获取列的唯一值,例如评分unique让我们试试吧!
这看起来很有趣。为什么在电影的独特评级类型中有 74 分钟、84 分钟和 66 分钟?为什么会有UR(Unrated)和NR(Not Rated)?他们不应该是同一个意思吗?让我们通过提取包含这些奇怪条目的行来进一步调查。
使用这个代码块,我们可以看到 3 个不同的行包含这个奇怪的评级,它实际上属于长度列。我们还可以看到问题所在的行号,这将有助于修复条目。
经过一些快速的谷歌搜索后,我们可以通过将“错误的评级”(实际上是持续时间)移动到长度列并输入正确的评级来继续修复这些条目。
对于rating列中的UR和NR值,我们应该保持数据集中使用NR的一致性netflix_shows,将UR值改为NR。
现在我们已经清理了列rating,让我们看看国家和listed_in列。rating到现在为止,您一定已经意识到提取唯一值并不像列那么容易。这是因为这些列中的值是由逗号连接在一起的单词,这使得提取单词集然后从该集中找到唯一单词变得更加困难。
我们将如何解决这个问题是通过为这个特殊情况实现一个独特的功能。
首先,让我们考虑一下什么样的数据结构可以轻松地为我们提供独特的价值。如果您猜对了集合,那您是对的!鉴于它能够按排序顺序存储相同类型的唯一元素,它是适合我们想要做的事情的数据结构。
然后,要提取那些由逗号连接的单词,我们可以使用该split函数将字符串按逗号拆分。
country使用该函数后,我们可以轻松获取和列的唯一值listed_in
接下来,让我们检查一下独特国家的列表,看看是否有任何不一致或错误。通过这样做并使用一点谷歌搜索,我们可以看到此列表存在一些问题:
  • 苏联和俄罗斯都有
  • 有西德/东德和德国
我们可以通过对数据集进行一些修改来轻松解决此问题。
至于流派列表,我们可以看到有些流派我们可能不想或不需要包括在内。因此,我们可以轻松地将其从数据集中删除,以减少我们的分析混淆。
在电视节目和电影数据集中,都有“电视节目”和“电影”类型。从技术上讲,这不是一种类型,但可以作为内容类型的标签。为了证实这一点,我们应该打印出出现在各个数据集中的这些“流派”的数量。
假设是,如果这些“流派”出现在数据集的所有行中,则意味着它们只是标签。否则,我们必须进一步调查这些“流派”代表什么。
由于“流派”的数量小于数据集的大小,让我们使用代码的输出来检查行。
因为我已经编写了专门输出列表中的行索引的代码,所以我们可以轻松地使用该列表和函数iloc来查看行。
notion image
notion image
查看这些行,现在很明显,“电视节目”和“电影”类型用于表示这些内容最初没有类型。现在我们明白了这意味着什么,我们可以选择将其排除在外或将其包括在我们的分析中。在这里,我选择包括它,因为它不会影响我的分析。
虽然这一步很繁琐,但它也很重要,因为它可以让我们第一眼就发现数据集中隐藏的问题。

第 八 步:将清理后的数据集连接在一起以创建另一个数据集 [可选]

此步骤是可选的,但如果您希望将清理后的电视节目和电影数据集放在一个地方,则应将它们连接起来
就是这样!您已成功清理此数据集。请记住,每个人都有自己的数据清理方法,其中很多只是通过努力了解您的数据集。但是,我希望本文能帮助您理解为什么数据科学家花费 80% 的时间来清理他们的数据集。严肃地说,本文强调了数据清理的重要性,更重要的是,需要一种良好的数据清理方法,这将帮助您保持工作井井有条,如果您需要在分析过程中返回它,这将有所帮助
 

作者:Huong Ngo
 

评论