数据清洗:pandas缺失值处理

缺失数据在大部分数据分析应用中都很常见,数据的缺失主要包括记录的缺失和记录中某个字段信息的缺失,两者都会造成分析结果的不准确。Python中的pandas库提供了对缺失数据的处理,pandas使用浮点值NaN(Not a Number)表示浮点和非浮点数组中的缺失数据,便于监测。

1.查看数据是否存在缺失值

  • 当数量少的时候,可以直接观察看是否存在缺失。
import pandas as pd
import numpy as np
data=pd.read_csv('data\Missing.csv',encoding='gb2312')
data

数据清洗:pandas缺失值处理

  • 当数据量大的时候,可以用describe()或isnull()函数来判断是否存在缺失。通过describe()的结果可以看出,规模以上工业企业增加值(亿元)、城镇人口比重(%)、总人口数(万人)3列的count值分别为12、15、15条数据,为缺失部分值;而城镇人口数的count为0,表示整个字段缺失。根据isnull()函数的结果同样可以看出,缺失值处为True,非缺失值处为False。
    数据清洗:pandas缺失值处理
    数据清洗:pandas缺失值处理

2.缺失值的处理

缺失值产生有多种原因。有些因暂时无法获取或者获取代价太大而导致缺失。有些可能是因为输入时认为不重要、忘记填写或对数据理解错误等一些人为因素而遗漏,也可能是由于数据采集设备的故障、存储介质的故障、传输媒体故障等非人为原因而丢失。有些属性值不存在,如一个未婚者的配偶姓名、一个儿童的固定收入等,这种缺失值并不意味着数据有错误。所以要根据缺失值产生的原因选择适当的处理方式,缺失值的处理方式主要有删除、填充、不处理。

(1)删除缺失值

DataFrame.dropna(axis=0, how=‘any’, thresh=None, subset=None, inplace=False)

  • axis:0 or ‘index’表示按行删除;1 or ‘columns’表示按列删除,默认为0。
  • how:‘any’表示该行/列至少有一个空值就删除该行/列;‘all’表示该行/列全部为空值就删除该行/列,默认为 ‘any’。
  • thresh:int型,表示如果该行/列的非空元素数量小于这个值,就删除该行/列,默认为None。
  • subset:行/列的索引列表,表示子集。如果axis=0或者‘index’,subset中元素为列的索引;如果axis=1或者‘column’,subset中元素为行的索引。由subset限制的子区域,删除该区域内存在缺失的行/列。
  • inplace:布尔值,表示是否替换。如果为True,则在原DataFrame上进行操作,返回值为None,默认为False。
    数据清洗:pandas缺失值处理
    数据清洗:pandas缺失值处理
(2)填充缺失值

DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)

  • value:用于填充缺失值的标量值或字典、元组对象;
  • method:插值方式,可选项为‘backfill’、‘bfill’、 ‘pad’、‘ffill’、None,默认为“ffill”。
  • axis:0 or ‘index’表示按行填充;1 or ‘columns’表示按列填充,默认为0。
  • inplace:布尔值,表示是否替换。如果为True,则在原DataFrame上进行操作,返回值为None,默认为False。
  • limit:(对于前向和后向填充)可以连续填充的最大数量。
  • downcast:dict,默认为None。

(a)设置value参数:以标量值或字典填充缺失值
数据清洗:pandas缺失值处理
数据清洗:pandas缺失值处理
数据清洗:pandas缺失值处理
(b)设置method参数:‘pad’、‘ffill’用前一个非缺失值填充该缺失值,‘backfill’、‘bfill’用下一个非缺失值去填充该缺失值。
注意,如果前一个或者下一个没有值,则无法填充缺失值。
数据清洗:pandas缺失值处理
数据清洗:pandas缺失值处理
数据清洗:pandas缺失值处理
结合实际情况,对示例数据中的缺失值做如下处理:

  • “城镇人口数”整列缺失,并且可以根据“总人口数(万人)”、“城镇人口比重(%)”两列计算所得,采用删除;
  • “规模以上工业企业增加值(亿元)” “城镇人口比重(%)” “总人口数(万人)”三列根据历史数据可得,随时间推移有增长趋势,故考虑到缺失值可能最接近上一个年份的数据,采用‘backfill’、‘bfill’方式填充该缺失值。
    数据清洗:pandas缺失值处理
    附:完整代码和数据可通过以下链接自行下载。
    链接:https://pan.baidu.com/s/1bHoczWdBzwU5oKSvq1-pYw
    提取码:7ozq

ps:初衷是通过撰写博文记录自己所学所用,实现知识的梳理与积累;将其分享,希望能够帮到面临同样困惑的小伙伴儿。如发现博文中存在问题,欢迎随时交流~~

上一篇:pandas库入门基础


下一篇:Matlab基本语法5