Python|使用 Python 进行数据清洗的完整指南

Python|使用 Python 进行数据清洗的完整指南

文章图片

Python|使用 Python 进行数据清洗的完整指南

文章图片

Python|使用 Python 进行数据清洗的完整指南

文章图片


你一定听说过这句著名的数据科学名言:


在数据科学项目中 ,80% 的时间是在做数据处理 。
如果你没有听过 , 那么请记住:数据清洗是数据科学工作流程的基础 。机器学习模型会根据你提供的数据执行 , 混乱的数据会导致性能下降甚至错误的结果 , 而干净的数据是良好模型性能的先决条件 。当然干净的数据并不意味着一直都有好的性能 , 模型的正确选择(剩余 20%)也很重要 , 但是没有干净的数据 , 即使是再强大的模型也无法达到预期的水平 。

在本文中将列出数据清洗中需要解决的问题并展示可能的解决方案 , 通过本文可以了解如何逐步进行数据清洗 。
缺失值当数据集中包含缺失数据时 , 在填充之前可以先进行一些数据的分析 。因为空单元格本身的位置可以告诉我们一些有用的信息 。例如:
  • NA值仅在数据集的尾部或中间出现 。这意味着在数据收集过程中可能存在技术问题 。可能需要分析该特定样本序列的数据收集过程 , 并尝试找出问题的根源 。
  • 如果列NA数量超过 70–80% , 可以删除该列 。
  • 如果 NA 值在表单中作为可选问题的列中 , 则该列可以被额外的编码为用户回答(1)或未回答(0) 。
missingno这个python库就可以用于检查上述情况 , 并且使用起来非常的简单 , 例如下图中的白线是 NA:
import missingno as msno
msno.matrix(df)

对于缺失值的填补计算有很多方法 , 例如:
  • 平均 , 中位数 , 众数
  • kNN
  • 零或常数等
不同的方法相互之间有优势和不足 , 并且没有适用于所有情况的“最佳”技术 。 具体可以参考我们以前发布的文章
异常值异常值是相对于数据集的其他点而言非常大或非常小的值 。它们的存在极大地影响了数学模型的性能 。让我们看一下这个简单的示例:

在左图中没有异常值 , 我们的线性模型非常适合数据点 。在右图中有一个异常值 , 当模型试图覆盖数据集的所有点时 , 这个异常值的存在会改变模型的拟合方式 , 并且使我们的模型不适合至少一半的点 。
对于异常值来说我们有必要介绍一下如何确定异常 , 这就要从数学角度明确什么是极大或极小 。
大于Q3+1.5 x IQR或小于Q1-1.5 x IQR都可以作为异常值 。IQR(四分位距) 是 Q3 和 Q1 之间的差 (IQR = Q3-Q1) 。
【Python|使用 Python 进行数据清洗的完整指南】可以使用下面函数来检查数据集中异常值的数量:
def number_of_outliers(df):
   
   df = df.select_dtypes(exclude = 'object')
   
   Q1 = df.quantile(0.25)
   Q3 = df.quantile(0.75)
   IQR = Q3 - Q1
   
   return ((df < (Q1 - 1.5 * IQR)) | (df > (Q3 + 1.5 * IQR))).sum()
处理异常值的一种方法是可以让它们等于 Q3 或 Q1 。下面的lower_upper_range 函数使用 pandas 和 numpy 库查找其外部为异常值的范围 ,然后使用clip 函数将值裁剪到指定的范围 。
def lower_upper_range(datacolumn):
   sorted(datacolumn)
   Q1Q3 = np.percentile(datacolumn[2575
)
   IQR = Q3 - Q1
   lower_range = Q1 - (1.5 * IQR)
   upper_range = Q3 + (1.5 * IQR)
   return lower_rangeupper_range
 
for col in columns:  
   lowerboundupperbound = lower_upper_range(df[col
)
   df[col
=np.clip(df[col
a_min=lowerbounda_max=upperbound)
数据不一致异常值问题是关于数字特征的 , 现在让我们看看字符类型(分类)特征 。数据不一致意味着列的唯一类具有不同的表示形式 。例如在性别栏中 , 既有m/f , 又有male/female 。 在这种情况下 , 就会有4个类 , 但实际上有两类 。
这种问题目前没有自动处理的办法 , 所以需要手动进行分析 。pandas 的unique函数就是为了这个分析准备的 , 下面看一个汽车品牌的例子:
df['CarName'