当前位置:   article > 正文

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

数据预处理|数据清洗|使用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()) 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  学号  姓名  年龄 政治面貌    系部   籍贯
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

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)) 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
删除含有缺失值的行:
 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

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)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  学号  姓名    年龄 政治面貌    系部  籍贯
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/249026
推荐阅读
相关标签
  

闽ICP备14008679号