数据读取及预处理方法-缺失值处理、独热编码、重复值处理、异常值检测

一个完整的数据分析流程大致应分为三步:收集数据、处理数据、数据建模预测及可视化。而在实际工作中,前两项内容占据的时间远远超过最后一步。

数据收集

三种方法:数据接口、数据库、数据爬虫

数据读取

在读取数据时,我们最常碰到的有两种形式:数据文件和数据库
数据,需要解压

import pandas as pd

df = pd.read_csv("test_file.txt", header=0, sep='\t')
#header=0 表示将第一行设为表头,而 sep='\t'则代表使用空格分隔字段
df

除了csv文件,Pandas 读取其他文件的方法如下:

  • pd.read_json # JSON 文件
  • pd.read_html # HTML 文件
  • pd.read_clipboard # 本地剪切板
  • pd.read_excel # MS Excel 文件
  • pd.read_hdf # HDF5Format 文件
  • pd.read_feather # Feather 格式
  • pd.read_msgpack # Msgpack
  • pd.read_stata # Stata
  • pd.read_sas # SAS
  • pd.read_pickle # Python Pickle 格式

除了数据文件,如果想要读取 MySQL,Oracle,Microsoft SQL 等数据库里面的数据。一般情况下都需要安装相应的第三方库。例如,读取 MySQL 时,我们需要安装 MySQLdb

数据预处理

df = pd.read_csv("test_file.csv")
df.head()  # 浏览头部数据
df.tail()  # 浏览尾部数据
df.describe()  # 数据统计
df.count()  # count() 用于计算数据集中非空数据的数量

缺失值处理
查找缺失值

df = pd.read_csv("test_file_nan.csv")
df.head(10)
#isnull() 和 notnull(),「是缺失值」和「不是缺失值」。默认会返回布尔值用于判断。
df.isnull()
df.notnull()

关于缺失值处理,主要有两种处理手段:删除缺失值所在的行或列或填充缺失值。

删除缺失值是最简单直接的办法之一。它适用于三种情况:

  1. 缺失值少,对数据集的影响可以忽略不计。比如一个数万行的数据集,恰好有某几行缺失了几个特征值。缺失的数据行远远小于全部数据的数量,且删除这几行之后,对原数据集的影响可以忽略。这时候,直接删除缺失值所在的行是最好的。
  2. 缺失数据量大,已无法挽救删除整列。比如一个数据集有 1 万行,存在 10 个特征列。其中某一项特征所在的列存在 9000 个空值。这也就表明该列存在的意义已经不大了。
  3. 该缺失值无法被填充。例如邮编是客观存在的,也是不能随意更改的。如果某几项邮编缺失,你是无法随意通过一些数值来填充邮编。

dropna() 方法可以将有缺失值的行或列全部移除。当然,你可以使用 axis=0 参数指定行,或 axis=1 参数指定列

df.dropna(axis=0)  #删除含有空值的行
df.dropna(axis=1)  #删除含有空值的行

填充缺失值
填充缺失值会直接改变原有数据集,这可能会影响后续预测分析的结果。所以,使用填充缺失值时一定要更加谨慎。
填充缺失值有三种方法:

  1. 手动填充。用于数据可以被人为有效确定.手动填充,充分展现了人的灵活性,但同样是一个费时费力的办法。
  2. 临近填充。采用与缺失值相邻的数据进行填充缺失值的方法。临近填充比较适合于零散的不确定数据。零散,指的是不会连续缺失数十个或上百个数据值。如果连续缺失的值太多,你用临近填充将其变为同一数据值,这对数据集整体的影响可想而知。不确定数据,就是通过视觉观察,无法发现相邻数据之间有什么联系,前后数据时大时小,无法被人为确定或找出规律
df.fillna(method='pad')  #空值用其前面的临近值进行了填充
df.fillna(method='bfill')  
#空值用其后面的临近值进行了填充
#这种情况下,最后一列如果有空值,就不会被有效填充

除了临近填充,有时候我们还会用 mean() 进行平均值填充。

3.插值填充。
插值填充就是采用数学的方法对数据进行插值。举个例子,有一列数据为 [2011, 2012, 2013, NaN,NaN,2016, 2017]。这里,无论你采用向前还是向后填充,其实都不是最好的。你可以发现数据是一个等差数列,缺失值应该分别为[2014, 2015],这也就是一个线性插值的过程。
Pandas 提供了相关插值方法,通过 interpolate() 方法实现。默认为参数为线性插值,即 method=‘linear’

df.interpolate()
  • 如果你的数据增长速率越来越快,可以选择 method=‘quadratic’ 二次插值。
  • 如果数据集呈现出累计分布的样子,推荐选择 method=‘pchip’。
  • 如果需要填补缺省值,以平滑绘图为目标,推荐选择 method=‘akima’

独热编码

对于一些分类变量,直接映射成数字是不行的。例如,某一装置的状态有三种情况,分别为:正常、机械故障、电路故障。如果我们要将这些数据运用到后续的预测分析中,就需要对文字状态进行转换。一般情况下,可以用 0 表示正常,1 代表机械故障,2 代表电路故障。
但是这种映射方式,往往会让学习器认为 2 代表电路故障比 1 代表机械故障更「大」,从而影响模型分析结果,这肯定是不行的。

df = pd.read_csv("one_hot_demo.csv", header=0)
df.head()
#在此演示文件中,status 共有 none, electric, engine 三类数值。
#color 有 red 和 green 两类
onehot = pd.get_dummies(df[['status', 'color']])
onehot
#字符串被进行了独热编码,特征也从原先的 2 列扩充为 5 列
#对每一个类别都单独拆成了一列,用0-1进行判断

重复值处理

pd.DataFrame.duplicated(df)
#pandas.DataFrame.duplicated() 可以用来标识重复数据,
#数据集中重复数据行会返回布尔类型 True

pd.DataFrame.drop_duplicates(df)
#pandas.DataFrame.drop_duplicates() 可以返回一个去重后的数据集

异常值检测

异常值检测:有从概率方法入手的一元正态分布及多元高斯方法,还有通过矩阵分解和神经网络进行异常值检测的相关方法

简单直观的异常值检测方法:箱形图(箱线图)
箱形图中,从上到下依次有 6 个数据节点,分别是上界、上四分位、均值、中位数、下四分位、下界。而那些超过上界的值就会被标记为离群点,也就是异常数据。

from matplotlib import pyplot as plt
%matplotlib inline

data = pd.read_csv("test_file.csv", header=0)
total_population = data["Total Population"]
plt.boxplot(total_population)
#做箱线图
#将离群点标记并导出
P = plt.boxplot(total_population)
outlier = P['fliers'][0].get_ydata()
outlier

data.boxplot()
#将data中所有列数据的箱形图画在一张图中对比
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值