python数据导入与清洗,python数据清洗是什么意思

  python数据导入与清洗,python数据清洗是什么意思

  数据清洗是指发现和纠正数据文件中可识别错误的最后一道程序,包括检查数据一致性、处理无效值和缺失值等。本文介绍了Python的数据清洗操作的详细说明,有需要的可以参考。

  00-1010缺失值、异常值、数据不一致、数据无效、数据重复、数据泄漏。你一定听过这句著名的数据科学名言:

  在数据科学项目中,80%的时间花在数据处理上。

  如果你没有听说过,那么请记住:数据清洗是数据科学工作流的基础。机器学习模型会根据你提供的数据来执行。混乱的数据会导致性能下降甚至错误的结果,干净的数据是良好模型性能的前提。当然,干净的数据并不意味着一直有好的表现,正确选择模型(剩下的20%)也很重要,但是没有干净的数据,即使是最强大的模型也无法达到预期的水平。

  在本文中,我们将列出数据清理中需要解决的问题,并展示可能的解决方案。通过本文,我们可以逐步了解如何清理数据。

  

目录

  当数据集包含缺失数据时,可以在填充之前分析一些数据。因为空细胞本身的位置可以告诉我们一些有用的信息。例如:

  NA值仅出现在数据集的末尾或中间。这意味着在数据收集过程中可能存在技术问题。可能需要分析这个特定样本序列的数据收集过程,并尝试找出问题的根源。如果色谱柱NA数量超过7080%,则可以删除该色谱柱。如果NA值作为可选问题出现在表格的列中,则该列可以另外编码为用户的答案(1)或无答案(0)。python库Missingno可以用来检查上述情况,使用起来非常简单。例如,下图中的白线是NA:

  将缺失号作为msno导入

  msno矩阵(df)

  缺失值的填充计算有多种方法,例如:

  平均值、中值、模式kNN零或常数等不同方法各有利弊,不存在适用于所有情况的“最佳”技术。详情请参考我们之前发表的文章。

  

缺失值

  离群值是相对于数据集中的其他点非常大或非常小的值。它们的存在极大地影响了数学模型的性能。让我们来看看这个简单的例子:

  左图没有异常值,我们的线性模型非常适合数据点。右图中有一个异常值。当模型试图覆盖数据集的所有点时,这个离群点的存在会改变模型的拟合方式,使我们的模型不适合至少一半的点。

  对于离群值,我们有必要介绍一下如何确定离群值,也就是从数学的角度定义什么是最大值或者最小值。

  大于Q3的1.5倍iqr或小于Q1-1.5倍IQR可用作异常值。IQR(四分位数距离)是Q3和Q1的差值(IQR=Q3-Q1)。

  您可以使用以下函数来检查数据集中异常值的数量:

  异常值数量(df):

  df=df . select _ dtypes(exclude= object )

  Q1=df .分位数(0.25)

  Q3=df .分位数(0.75)

  IQR=Q3 - Q1

  return((df(Q1-1.5 * IQR))(df(Q3 1.5 * IQR))。总和()

  处理异常值的一种方法是让它们等于Q3或Q1。下面的lower_upper_range函数使用pandas和numpy库来查找外部有异常值的范围,然后使用clip函数将值裁剪到指定的范围。

  def lower_upper_range(数据列):

  已排序(数据列)

  Q1,Q3=np.percentile(数据列,[25,75])

  IQR=Q3 - Q1

  lower_range=Q1 - (1.5 * IQR)

  upper_range=Q3 (1.5 * IQR)

  返回下限范围,上限范围

  对于列中的列

  ns:

   lowerbound,upperbound = lower_upper_range(df[col])

   df[col]=np.clip(df[col],a_min=lowerbound,a_max=upperbound)

  

  

  

数据不一致

  异常值问题是关于数字特征的,现在让我们看看字符类型(分类)特征。 数据不一致意味着列的唯一类具有不同的表示形式。 例如在性别栏中,既有m/f,又有male/female。在这种情况下,就会有4个类,但实际上有两类。

  这种问题目前没有自动处理的办法,所以需要手动进行分析。 pandas 的unique函数就是为了这个分析准备的,下面看一个汽车品牌的例子:

  

df[CarName] = df[CarName].str.split().str[0] 

  print(df[CarName].unique())

  

  maxda-mazda, Nissan-nissan, porcshce-porsche, toyouta-toyota等都可以进行合并。

  

df.loc[df[CarName] == maxda, CarName] = mazda 

  df.loc[df[CarName] == Nissan, CarName] = nissan

  df.loc[df[CarName] == porcshce, CarName] = porsche

  df.loc[df[CarName] == toyouta, CarName] = toyota

  df.loc[df[CarName] == vokswagen, CarName] = volkswagen

  df.loc[df[CarName] == vw, CarName] = volkswagen

  

  

  

无效数据

  无效的数据表示在逻辑上根本不正确的值。 例如,

  

  • 某人的年龄是 560;
  • 某个操作花费了 -8 小时;
  • 一个人的身高是1200 cm等;

  对于数值列,pandas的 describe 函数可用于识别此类错误:

  

df.describe()

  

  无效数据的产生原因可能有两种:

  1、数据收集错误:例如在输入时没有进行范围的判断,在输入身高时错误的输入了1799cm 而不是 179cm,但是程序没有对数据的范围进行判断。

  2、数据操作错误

  数据集的某些列可能通过了一些函数的处理。 例如,一个函数根据生日计算年龄,但是这个函数出现了BUG导致输出不正确。

  以上两种随机错误都可以被视为空值并与其他 NA 一起估算。

  

  

重复数据

  当数据集中有相同的行时就会产生重复数据问题。 这可能是由于数据组合错误(来自多个来源的同一行),或者重复的操作(用户可能会提交他或她的答案两次)等引起的。 处理该问题的理想方法是删除复制行。

  可以使用 pandas duplicated 函数查看重复的数据:

  

df.loc[df.duplicated()]

  

  在识别出重复的数据后可以使用pandas 的 drop_duplicate 函数将其删除:

  

df.drop_duplicates()

  

  

  

数据泄漏问题

  在构建模型之前,数据集被分成训练集和测试集。 测试集是看不见的数据用于评估模型性能。 如果在数据清洗或数据预处理步骤中模型以某种方式看到了测试集,这个就被称做数据泄漏(data leakage)。 所以应该在清洗和预处理步骤之前拆分数据:

  

  以选择缺失值插补为例。数值列中有 NA,采用均值法估算。在 split 前完成时,使用整个数据集的均值,但如果在 split 后完成,则使用分别训练和测试的均值。

  第一种情况的问题是,测试集中的推算值将与训练集相关,因为平均值是整个数据集的。所以当模型用训练集构建时,它也会看到测试集。但是我们拆分的目标是保持测试集完全独立,并像使用新数据一样使用它来进行性能评估。所以在操作之前必须拆分数据集。

  虽然训练集和测试集分别处理效率不高(因为相同的操作需要进行2次),但它可能是正确的。因为数据泄露问题非常重要,为了解决代码重复编写的问题,可以使用sklearn 库的pipeline。简单地说,pipeline就是将数据作为输入发送到的所有操作步骤的组合,这样我们只要设定好操作,无论是训练集还是测试集,都可以使用相同的步骤进行处理,减少的代码开发的同时还可以减少出错的概率。

  到此这篇关于利用Python进行数据清洗的操作指南的文章就介绍到这了,更多相关Python数据清洗内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: