Advertisement

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

阅读量:

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

  • 数据预处理--缺失值清洗
    • 1. 缺失值的检测与统计
    • 2. 删除缺失值
    • 3. 填充缺失值

数据预处理(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. 删除缺失值

遵循特定的标准对包含缺失值的数据行或列执行数据清理操作以完成数据完整性目标

复制代码
    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的方法用于处理缺失数据问题,在具体实现上可以通过指定不同的参数来进行灵活配置:其中参数包括value表示替换的数值,默认情况下会将所有缺失值替换为空字符串;method则用于指定填补的方式;asxi用于指定行索引;inplace则用于指示是否进行原地修改;limit则用于限制填补的数量或范围等不同功能选项。

常见的填充方法有:
1. 选择固定的数值进行填充
2. 计算各列的平均值得到填补
3. 采用中位数作为缺失数据替代
4. 根据众数组来填充值
5. 通过相邻样本的数据进行填补
6. 利用插补法填补缺少的部分
7. 通过KNN算法找到最近邻来代替缺漏部分
8. 利用机器学习模型预测填充值

复制代码
    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

全部评论 (0)

还没有任何评论哟~