数据预处理|数据清洗|使用Pandas进行缺失值清洗

数据预处理(Data Preprocessing)是指在数据挖掘之前对原始数据进行的一些处理。现实世界中的数据几乎都是“脏”数据,所采集的数据极易受到不一致数据、噪声、缺失值的侵扰。

  1. 数据的不一致性:原始数据是从各种实际应用系统中采集的,而各应用系统的数据缺乏统一的标准和定义,数据结构具有较大的差异。
  2. 噪声数据:数据采集过程中会受到采集设备故障、数据传输错误或存储介质损坏等因素的干扰,导致采集到的数据可能含有噪声,即不精确或不准确的数据。
  3. 缺失值:系统设计缺陷或使用过程中的人为因素可能导致数据记录中某些属性值丢失或不确定,从而造成数据不完整,例如数据采集传感器故障导致某些数据无法采集等。
    针对数据中存在的问题和数据质量要求,数据预处理过程主要包括数据清洗、数据集成、数据归约和数据变换等方法。

数据预处理–缺失值清洗

  • 缺失值处理方法:
    1) 删除法
    2) 替换法
    3) 插补法
  • Pandas 使用浮点值 NaN 表示缺失数据,以下介绍 pandas 处理缺失值的常用的操作:

1. 缺失值的检测与统计

使用pandasDataFrame对象类。

  • isnull()(或notnull())方法可以直接判断该列中的哪个数据为NaN,缺失值时为True(或False),非缺失值时为False(或True)。
  • info() 方法查看非缺失值的信息
  • isnull().sum() 方法统计出各列缺失值的数量。
    代码示例如下:
import numpy as np
import pandas as pd
df=pd.DataFrame(
    [['1','张秀',21,'团员',np.NaN,np.NaN], 
     ['2','李峰',20,np.NaN,'信息系','贵州'],
     ['3','王元',22,np.NaN,'计算机系',np.NaN]], 
    columns=['学号','姓名','年龄','政治面貌','系部','籍贯']) 
print(df)
#打印出各列数据的非缺失值信息
print(df.info()) 
#打印出缺失值信息,缺失值时为True,非缺失值时为False
print(df.isnull()) 
#打印出各列中缺失值的数量
print(df.isnull().sum()) 

  学号  姓名  年龄 政治面貌    系部   籍贯
0  1  张秀  21   团员   NaN  NaN
1  2  李峰  20  NaN   信息系   贵州
2  3  王元  22  NaN  计算机系  NaN
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 6 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   学号      3 non-null      object
 1   姓名      3 non-null      object
 2   年龄      3 non-null      int64 
 3   政治面貌    1 non-null      object
 4   系部      2 non-null      object
 5   籍贯      1 non-null      object
dtypes: int64(1), object(5)
memory usage: 272.0+ bytes
None
      学号     姓名     年龄   政治面貌     系部     籍贯
0  False  False  False  False   True   True
1  False  False  False   True  False  False
2  False  False  False   True  False   True
学号      0
姓名      0
年龄      0
政治面貌    2
系部      1
籍贯      2
dtype: int64

2. 删除缺失值

根据一定的规则将含有缺失值的行或列直接进行删除。dropna()Pandas库中DataFrame的一个方法,用于删除缺失值。常用形式如下:
dropna(axis=0, how='any', thresh=None, subset=None, ,inplace=False)

import numpy as np
import pandas as pd
df=pd.DataFrame(
    [['1','张秀',21,'团员',np.NaN,np.NaN], 
     ['2','李峰',20,np.NaN,'信息系','贵州'],
     ['3','王元',22,np.NaN,'计算机系',np.NaN]], 
    columns=['学号','姓名','年龄','政治面貌','系部','籍贯']) 
#删除含有缺失值的行
print("删除含有缺失值的行:\n",df.dropna())
#删除含有缺失值的列
print("删除含有缺失值的列:\n",df.dropna(axis=1)) 
#保留至少具有5个非NaN值的行
print("保留至少具有5个非NaN值的行:\n",df.dropna(thresh=5))
#保留至少具有3个非NaN值的列
print("保留至少具有3个非NaN值的列:\n",
      df.dropna(thresh=3,axis=1)) 

删除含有缺失值的行:
 Empty DataFrame
Columns: [学号, 姓名, 年龄, 政治面貌, 系部, 籍贯]
Index: []
删除含有缺失值的列:
   学号  姓名  年龄
0  1  张秀  21
1  2  李峰  20
2  3  王元  22
保留至少具有5个非NaN值的行:
   学号  姓名  年龄 政治面貌   系部  籍贯
1  2  李峰  20  NaN  信息系  贵州
保留至少具有3个非NaN值的列:
   学号  姓名  年龄
0  1  张秀  21
1  2  李峰  20
2  3  王元  22

3. 填充缺失值

直接删除缺失值的样本并不是一个很好的方法,因此可以用一个特定的值替换缺失值。缺失值所在的属性为数值型时,通常利用其均值、中位数和众数等描述其集中趋势的统计量来填充;缺失值所在属性为类别型数据时,则可以选择众数来填充。
Pandas 库中提供了缺失值替换的方法 fillna() ,常用形式如下:
fillna(value=None,method=None,asxi=None,inplace=False,limit=None)

常见的填充方法有:
1. 填充固定值:选取某个固定值/默认值填充缺失值。
2. 填充均值:对每一列的缺失值,填充当前列的均值。
3. 填充中位数:对每一列的缺失值,填充当前列的中位数。
4. 填充众数:对每一列的缺失值,填充当前列的众数。如果存在某列缺失值过多,众数为NaN的情况,这时就取每列删除掉NaN值后的众数。
5. 填充上下样本的数据:对每一数据样本的缺失值,填充其上面一个或下面一个样本的数据值。
6. 填充插值得到的数据:用插值法拟合出缺失的数据,然后进行填充。常用interpolate()函数默认采用线性插值,即假设函数是直线形式,缺失值用前一个值和后一个值的平均数填充。
7. 填充KNN数据:填充近邻的数据,先利用KNN计算临近的k个数据,然后填充它们的均值。
8. 填充模型预测的值:把缺失值作为新的Label,建立模型得到预测值,然后进行填充。

import numpy as np
import pandas as pd
df=pd.DataFrame(
    [['1','张秀',21,'团员',np.NaN,np.NaN], 
     ['2','李峰',np.NaN,np.NaN,'信息系','贵州'],
      ['3','赵峰',np.NaN,np.NaN,'信息系','贵州'],
     ['4','王元',24,np.NaN,'计算机系',np.NaN]], 
    columns=['学号','姓名','年龄','政治面貌','系部','籍贯'])
print(df.fillna(-1)) #填充缺失值为'-1'
print(df.fillna(method='ffill')) #向下填充缺失值
#年龄列的缺失值用其均值填充
print(df['年龄'].fillna(df['年龄'].mean())) 
print(df.fillna(df.mode())) #利用众数填充缺失值
for n in df:                  
    df[n]=df[n].interpolate() #数值型属性用线性插值
    df[n].dropna(inplace=True)
print(df)

  学号  姓名    年龄 政治面貌    系部  籍贯
0  1  张秀  21.0   团员    -1  -1
1  2  李峰  -1.0   -1   信息系  贵州
2  3  赵峰  -1.0   -1   信息系  贵州
3  4  王元  24.0   -1  计算机系  -1
  学号  姓名    年龄 政治面貌    系部   籍贯
0  1  张秀  21.0   团员   NaN  NaN
1  2  李峰  21.0   团员   信息系   贵州
2  3  赵峰  21.0   团员   信息系   贵州
3  4  王元  24.0   团员  计算机系   贵州
0    21.0
1    22.5
2    22.5
3    24.0
Name: 年龄, dtype: float64
  学号  姓名    年龄 政治面貌    系部   籍贯
0  1  张秀  21.0   团员   信息系   贵州
1  2  李峰  24.0  NaN   信息系   贵州
2  3  赵峰   NaN  NaN   信息系   贵州
3  4  王元  24.0  NaN  计算机系  NaN
  学号  姓名    年龄 政治面貌    系部   籍贯
0  1  张秀  21.0   团员   NaN  NaN
1  2  李峰  22.0  NaN   信息系   贵州
2  3  赵峰  23.0  NaN   信息系   贵州
3  4  王元  24.0  NaN  计算机系  NaN
  • 18
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
【资源说明】 基于Flask的Python全国招聘岗位就业可视化系统源码+项目部署说明+详细注释.zip 1、该资源内项目代码都是经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能。 1 开发环境** * 1 系统:Window 10 家庭中文版。 * 2 语言:Python(3.8.5)、MySQL(5.5)。 * 3 Python所需的库:flask、pymysql、pandas、numpy、time、datetime、requests、etree、jieba、re、json、decimal(没有的话pip或conda安装一下~)。 * 4 编辑器:jupyter Lab(jupyter notebook)、Pycharm(主用)、Navicat。 2 运行说明** 本项目下面有五个.py的文件,下面分别阐述各个文件所对应的功能:<br> * 1 data_collection:分别从前程无忧网站和猎聘网上以关键词`job_name`爬取相关数据。其中,前程无忧爬取的数据主要用来进行相关图表的绘制;而猎聘网上主要为岗位要求文本数据,这部分进行词云的可视化展示。 * 2 data_clean:对爬取到的数据进行清洗,包括去重去缺失、变量重编码、特征字段创造、文本分词等。 * 3 data_store:将清洗后的数据全部储存到`MySQL`中,其中对文本数据使用`jieba.analyse`下的`extract_tags`来获取文本中的关键词和权重大小,方便绘制词云。 * 4 utils:大多为app调用MySQL数据库中的工具类函数;同时,里面也有引用data_collection、data_clean、data_store等函数,我们也主要使用该工具类进行岗位数据的爬取、清洗和存储。 * 5 app:使用`Python`一个小型轻量的`Flask`框架来进行`Web`可视化系统的搭建,在static中有css和js文件,js中大多为百度开源的[ECharts](https://echarts.apache.org/examples/zh/index.html),再通过自定义`controller.js`来使用ajax调用flask已设定好的路由,将数据异步刷新到templates下的`main.html`中。 * 6 如何运行:先运行utils,提前进行数据采集、数据清洗数据存储操作,之后更改app修改好`datatable`和`job_name`,这部分信息务必与utils中输入的保持一致(因为发现app一运行的话就会直接给出网页,所以没法在控制台上同步将变量赋过去*_*)。 * 7 温馨提示:由于我在数据采集部分使用了一个用redis搭建的代理IP池,所以一开始运行的话需要将里面的proxies删掉,使用time.sleep即可(使用代理池能防止被封IP,同时可以更快爬取数据,实现可视化操作)。 3 你将会学到** * 1 Python爬虫:盗亦有道,掌握requests和xpath的相关用法。 * 2 数据清洗:能详细知道项目中数据预处理的步骤,包括去重去缺失、变量重编码、特征字段创造和文本数据预处理,玩转pandas、numpy相关用法。 * 3 数据库知识:select、insert等操作,掌握pymysql相关用法。 * 4 前后端知识:了解到HTML、JQuery、JavaScript、Ajax的相关用法。 * 5 Flask知识:能快速建立起一个轻量级的Web框架,利用Python实现前后端交互。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皖山文武

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值