【python数据分析-数据预处理】如何使用python处理缺失值

在数据处理中,第一步是对数据做清洗,主要是处理缺失值、异常值和重复值

具体的清洗方法指对异常数据进行丢弃、填充、替换、去重等操作。

一、方法梳理

缺失值由于其存储环境不同,会有不同的表现形式。例如,在数据库中的缺失值是Null,python中的缺失值返回对象为None,pandas或numpy中的表现形式为NaN

在对缺失值检测时,首先我们要弄清楚在我们的数据集中,缺失值的表现方式。

在找到缺失值后,具体的处理方法可分为以下几类:

  1. 丢弃

即直接删除带有缺失值的行或者列。

这种方法会减少特征,面对以下两种情况时不宜使用:

  • 数据集中存在大量的数据缺失现象。
  • 存在缺失值的列存在着明显的数据分布规律及特征。

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%免费

  • 17
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个Python数据预处理的代码实例。 假设我们有一个包含学生成绩的数据集,文件名为"grades.csv",数据格式如下: ``` Name,Math,English,Science Alice,90,85,92 Bob,80,75,88 Charlie,75,92,82 David,92,87,90 ``` 我们需要进行以下数据预处理操作: 1. 将文件读取为一个Pandas DataFrame。 2. 检查是否有缺失。 3. 将每个科目的分数转换为百分制。 4. 计算每个学生的平均分。 5. 将每个学生的平均分按照从高到低排序。 6. 将处理后的数据保存为一个新文件。 下面是相应的代码实现: ```python import pandas as pd # 读取数据 df = pd.read_csv("grades.csv") # 检查是否有缺失 if df.isnull().values.any(): print("Warning: There are missing values in the data.") # 将每个科目的分数转换为百分制 df["Math"] = df["Math"] / 100.0 * 100 df["English"] = df["English"] / 100.0 * 100 df["Science"] = df["Science"] / 100.0 * 100 # 计算每个学生的平均分 df["Average"] = df.mean(axis=1) # 将每个学生的平均分按照从高到低排序 df = df.sort_values(by=["Average"], ascending=False) # 保存处理后的数据为一个新文件 df.to_csv("processed_grades.csv", index=False) ``` 执行完上述代码后,将生成一个新的文件"processed_grades.csv",内容如下: ``` Name,Math,English,Science,Average David,92.0,87.0,90.0,89.66666666666667 Alice,90.0,85.0,92.0,89.0 Charlie,75.0,92.0,82.0,83.0 Bob,80.0,75.0,88.0,81.0 ``` 以上就是一个简单的Python数据预处理代码实例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值