在数据分析之前对数据进行预处理是十分必要的,这一过程能帮我们清除或处理掉数据中的噪音,为后续的分析和建模工作做准备。本次笔记中将会介绍通过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'})
数据缺失值的填充方法还有很多,如通过相关统计量来填充,或者通过回归、聚类等算法来填充等,根据实际中的具体情况来选择合适的填充方法。
网友评论