数据预处理之缺失值(python)

在数据分析之前对数据进行预处理是十分必要的,这一过程能帮我们清除或处理掉数据中的噪音,为后续的分析和建模工作做准备。本次笔记中将会介绍通过python的pandas库进行数据的缺失值查找与简单处理。

笔记大纲:
数据读取
数据概览
缺失值查找
缺失值处理

1、数据读取
导入excel数据,这里的数据来源于“猴子聊人物”所发布的数据资料。
百度网盘:https://pan.baidu.com/s/14Ulh_S1JqZUAD02-M_3Zlw
提取码:wg18

>>> import pandas as pd
>>> import numpy as np

>>> data = pd.read_excel('朝阳医院2018年销售数据.xlsx', header=0, sheetname=0)
# header表示读取第一行作为列名,sheetname为读取sheet1,你也可以直接用sheet的名字

2、数据概览
在进行数据读取之后,我们需要查看数据的基本结构,包含但不限于行列数(名)、数据类型、数据分布等。

# 查看行列数
>>> data.shape
(6578, 7)
# 查看前10行数据 
>>> data.head(10)
                 购药时间          社保卡号      商品编码     商品名称  销售数量   应收金额    实收金额
0  2018-01-01 星期五  1.616528e+06  236701.0  强力VC银翘片   6.0   82.8   69.00
1  2018-01-02 星期六  1.616528e+06  236701.0  清热解毒口服液   1.0   28.0   24.64
2  2018-01-06 星期三  1.260283e+07  236701.0       感康   2.0   16.8   15.00
3  2018-01-11 星期一  1.007034e+10  236701.0    三九感冒灵   1.0   28.0   28.00
4  2018-01-15 星期五  1.015543e+08  236701.0    三九感冒灵   8.0  224.0  208.00
5  2018-01-20 星期三  1.338953e+07  236701.0    三九感冒灵   1.0   28.0   28.00
6  2018-01-31 星期日  1.014649e+08  236701.0    三九感冒灵   2.0   56.0   56.00
7  2018-02-17 星期三  1.117733e+07  236701.0    三九感冒灵   5.0  149.0  131.12
8  2018-02-22 星期一  1.006569e+10  236701.0    三九感冒灵   1.0   29.8   26.22
9  2018-02-24 星期三  1.338953e+07  236701.0    三九感冒灵   4.0  119.2  104.89
# 数值型数据的分布情况
>>> data.describe()
  社保卡号          商品编码         销售数量         应收金额         实收金额
count  6.576000e+03  6.577000e+03  6577.000000  6577.000000  6577.000000
mean   6.091254e+09  1.015869e+06     2.386194    50.473803    46.317510
std    4.889284e+09  5.131153e+05     2.375202    87.595925    80.976702
min    1.616528e+06  2.367010e+05   -10.000000  -374.000000  -374.000000
25%    1.014234e+08  8.614560e+05     1.000000    14.000000    12.320000
50%    1.001650e+10  8.615070e+05     2.000000    28.000000    26.600000
75%    1.004882e+10  8.690690e+05     2.000000    59.600000    53.000000
max    1.283612e+10  2.367012e+06    50.000000  2950.000000  2650.000000

通过对数据进行描述性统计可以看出一些明显的错误,比如销售数量、应收金额和实收金额存在负数,且金额字段离散程度较大,可能需要在后期进行处理,这段我们放在异常值处理中进行介绍。

3、缺失值查找

# 存在缺失值的列,发现每列中都存有缺失值
>>> data.isnull().any()
购药时间    True
社保卡号    True
商品编码    True
商品名称    True
销售数量    True
应收金额    True
实收金额    True
dtype: bool
# 均为缺失值的列,发现没有一列是都为空的
>>> data.isnull().all()
购药时间    False
社保卡号    False
商品编码    False
商品名称    False
销售数量    False
应收金额    False
实收金额    False
dtype: bool
# 查找存在缺失值的行
>>> nan_lines = data.isnull().any(1)
# 统计有多少行存在缺失值
>>> nan_lines.sum()
3
# 查看有缺失值的行信息
>>> data[nan_lines]
                购药时间        社保卡号       商品编码 商品名称  销售数量  应收金额   实收金额
6570             NaN  11778628.0  2367011.0  高特灵  10.0  56.0  56.00
6571  2018-04-25 星期二         NaN  2367011.0  高特灵   2.0  11.2   9.86
6574             NaN         NaN        NaN  NaN   NaN   NaN    NaN

经过缺失值查找,可以发现数据中共有三行存在着缺失值,其中有一行为完全缺失,另外两行为部分缺失,下面对缺失值进行处理。

4、缺失值处理
对于完全缺失的行,这里直接删除,对于部分缺失行,则进行填充。

# 删除完全缺失的行,若不指定参数how,则删除的是所有含有nan的行
>>> data.shape
(6578, 7)
>>> data_drop_nan = data.dropna(how='all')
>>> data_drop_nan.shape
(6577, 7)
>>> data.dropna().shape
(6575, 7)
# 对部分缺失行进行填充
# 用后一行的值填充前一行的缺失值
>>> data_drop_nan.fillnan(method='backfill')
# 对指定列填充指定值
>>> data_drop_na.fillna({'购药时间':'2018-01-20 星期三', '社保卡号': '1.338953e+07'})

数据缺失值的填充方法还有很多,如通过相关统计量来填充,或者通过回归、聚类等算法来填充等,根据实际中的具体情况来选择合适的填充方法。

你可能感兴趣的:(数据预处理之缺失值(python))