在数据处理中,第一步是对数据做清洗,主要是处理缺失值、异常值和重复值。
具体的清洗方法指对异常数据进行丢弃、填充、替换、去重等操作。
一、方法梳理
缺失值由于其存储环境不同,会有不同的表现形式。例如,在数据库中的缺失值是Null,python中的缺失值返回对象为None,pandas或numpy中的表现形式为NaN。
在对缺失值检测时,首先我们要弄清楚在我们的数据集中,缺失值的表现方式。
在找到缺失值后,具体的处理方法可分为以下几类:
- 丢弃
即直接删除带有缺失值的行或者列。
这种方法会减少特征,面对以下两种情况时不宜使用:
- 数据集中存在大量的数据缺失现象。
- 存在缺失值的列存在着明显的数据分布规律及特征。
2. 补全
补全是相较于丢弃而言更常用的缺失值处理方法。具体包括:
- 统计法:对于数值型数据,使用均值、加权均值、中位数等方法补足;对于分类数据,使用众数进行补足
- 模型法:基于已有其他字段,将缺失字段作为目标变量进行预测,从而得到最为可能的补全值。数值型变量采取回归模型,分类变量使用分类变量补全。
- 专家补全:适用于少量且有重要意义的数据
- 其他方法:随机法、特殊值法、多重填补等
3. 不处理
很多模型对于缺失值有容忍度或灵活的处理方法,因此在预处理阶段,并不需要做额外处理。
能够自动处理缺失值的模型包括:KNN、决策树和随机森林、神经网络、朴素贝叶斯等
二、实操
import pandas as pd
import numpy as np
from sklearn.impute import SimpleImputer
# 生成数据
df = pd.DataFrame(np.random.randn(6,4),columns = ['col1','col2','col3','col4'])
# 增加缺失值
df.iloc[1:2,1] = np.nan
# 增加缺失值
df.iloc[4,3] = np.nan
print(df)
-----------------------------------------
col1 col2 col3 col4
0 0.433958 0.591058 -0.612842 -3.062732
1 -0.316670 NaN -1.114521 1.843260
2 -1.567634 -0.299174 0.892840 1.023605
3 -0.325521 1.370947 1.121605 1.376905
4 3.254147 -0.971884 -1.093605 NaN
5 0.178115 1.435047 1.161732 -0.248517
# 查看有哪些值缺失
nan_null = df.isnull()
print(nan_null)
-----------------------------------------
col1 col2 col3 col4
0 False False False False
1 False True False False
2 False False False False
3 False False False False
4 False False False True
5 False False False False
# 查看有哪些列缺失
nan_col1 = df.isnull().any()
print(nan_col1)
-----------------------------------------
col1 False
col2 True
col3 False
col4 True
dtype: bool
# 查看全部缺失的列
nan_col2 = df.isnull().all()
print(nan_col2)
-----------------------------------------
col1 False
col2 False
col3 False
col4 False
dtype: bool
# 丢弃缺失值
df2 = df.dropna()
print(df2)
-----------------------------------------
col1 col2 col3 col4
0 0.433958 0.591058 -0.612842 -3.062732
2 -1.567634 -0.299174 0.892840 1.023605
3 -0.325521 1.370947 1.121605 1.376905
5 0.178115 1.435047 1.161732 -0.248517
# 使用sklearn将缺失值替换为特定值(以平均值为例)
nan_model = SimpleImputer(missing_values=np.nan,strategy='mean')
nan_result = nan_model.fit_transform(df)
print(nan_result)
-----------------------------------------
[[ 0.43395845 0.59105794 -0.61284234 -3.06273187]
[-0.31667021 0.42519893 -1.11452071 1.84326008]
[-1.56763396 -0.29917364 0.89284028 1.02360524]
[-0.32552126 1.37094719 1.12160529 1.37690458]
[ 3.25414698 -0.97188394 -1.09360498 0.18650413]
[ 0.17811483 1.43504711 1.16173166 -0.24851737]]
# 使用pandas将缺失值替换为特定值
nan_result_pd1 = df.fillna(method='backfill') # 用后一个值替换缺失值
nan_result_pd2 = df.fillna(method='backfill',limit=1) # 用后一个值替换缺失值,限制每列只能替换一个缺失值
nan_result_pd3 = df.fillna(method='pad') # 用前一个值替换缺失值
nan_result_pd4 = df.fillna(0) # 用0替换缺失值
nan_result_pd5 = df.fillna({'col2':1.1,'col4':1.2}) # 对特定列的缺失值填充具体数据
nan_result_pd6 = df.fillna(df.mean()['col1':'col4']) # 用均值填充缺失值
print(nan_result_pd1)
print(nan_result_pd2)
print(nan_result_pd3)
print(nan_result_pd4)
print(nan_result_pd5)
print(nan_result_pd6)
-----------------------------------------
col1 col2 col3 col4
0 0.433958 0.591058 -0.612842 -3.062732
1 -0.316670 -0.299174 -1.114521 1.843260
2 -1.567634 -0.299174 0.892840 1.023605
3 -0.325521 1.370947 1.121605 1.376905
4 3.254147 -0.971884 -1.093605 -0.248517
5 0.178115 1.435047 1.161732 -0.248517
col1 col2 col3 col4
0 0.433958 0.591058 -0.612842 -3.062732
1 -0.316670 -0.299174 -1.114521 1.843260
2 -1.567634 -0.299174 0.892840 1.023605
3 -0.325521 1.370947 1.121605 1.376905
4 3.254147 -0.971884 -1.093605 -0.248517
5 0.178115 1.435047 1.161732 -0.248517
col1 col2 col3 col4
0 0.433958 0.591058 -0.612842 -3.062732
1 -0.316670 0.591058 -1.114521 1.843260
2 -1.567634 -0.299174 0.892840 1.023605
3 -0.325521 1.370947 1.121605 1.376905
4 3.254147 -0.971884 -1.093605 1.376905
5 0.178115 1.435047 1.161732 -0.248517
col1 col2 col3 col4
0 0.433958 0.591058 -0.612842 -3.062732
1 -0.316670 0.000000 -1.114521 1.843260
2 -1.567634 -0.299174 0.892840 1.023605
3 -0.325521 1.370947 1.121605 1.376905
4 3.254147 -0.971884 -1.093605 0.000000
5 0.178115 1.435047 1.161732 -0.248517
col1 col2 col3 col4
0 0.433958 0.591058 -0.612842 -3.062732
1 -0.316670 1.100000 -1.114521 1.843260
2 -1.567634 -0.299174 0.892840 1.023605
3 -0.325521 1.370947 1.121605 1.376905
4 3.254147 -0.971884 -1.093605 1.200000
5 0.178115 1.435047 1.161732 -0.248517
col1 col2 col3 col4
0 0.433958 0.591058 -0.612842 -3.062732
1 -0.316670 0.425199 -1.114521 1.843260
2 -1.567634 -0.299174 0.892840 1.023605
3 -0.325521 1.370947 1.121605 1.376905
4 3.254147 -0.971884 -1.093605 0.186504
5 0.178115 1.435047 1.161732 -0.248517
关于Python学习指南
学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!
👉Python所有方向的学习路线👈
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取)
👉Python学习视频600合集👈
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
温馨提示:篇幅有限,已打包文件夹,获取方式在:文末
👉Python70个实战练手案例&源码👈
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
👉Python大厂面试资料👈
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
👉Python副业兼职路线&方法👈
学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。
👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以扫描下方CSDN官方认证二维码或者点击链接免费领取【保证100%免费
】