数据分析—缺失值处理

栏目: Python · 发布时间: 5年前

阅读 22

数据分析—缺失值处理

我们获取到的数据(尤其是数据量比较大时),很有可能会出现数据缺失、数据异常等问题,数据处理是数据分析里十分重要且必须的一个环节,为了在做数据分析时尽可能减少异常的出现,以及得出更精准的分析结论,因此在做数据分析之前,数据处理显得尤其必要

阅读条件:熟悉pandas基本操作

使用工具:Python

使用平台:jupyter notebook

缺失值处理

缺失值判断

python主要读取的是csv或者excel数据,excel中单元格为空时,pandas读取显示的是NaN,即为缺失值

判断缺失值数据方法: isnull,notnull

  • isnull:True表示缺失,False表示非缺失
  • notnull:True表示非缺失,False表示缺失

首先导入 python 数据分析必选 工具

import numpy as np
import pandas as pd
__author__='莫叹'复制代码

生成一个表格型的二维数组df

#生成一个表格型的二维数组
df=pd.DataFrame({'a':[34,6,20,np.nan,56],
               'b':['juejin','number','one','good',np.nan]})复制代码

输出如下:

数据分析—缺失值处理

判断数据中是否存在缺失值以及非缺失值数据筛选:

#判断二维数组df是否缺失
print(df.notnull(),'\n')
#通过索引判断a列是否缺失
print(df['a'].notnull(),'\n')
#筛选a列不存在缺失值数组
print(df[df['a'].notnull()])复制代码

输出如下:

a      b
0   True   True
1   True   True
2   True   True
3  False   True
4   True  False 

0     True
1     True
2     True
3    False
4     True
Name: a, dtype: bool 

      a       b
0  34.0  juejin
1   6.0  number
2  20.0     one
4  56.0     NaN复制代码

缺失值删除

通过上面的notnull布尔序列值筛选也是缺失值删除的一种方法

缺失值的删除需要按照具体数据情况和业务情况来处理,有时候需要删除全部缺失数据,有时候需要删除部分缺失数据,有时候只是需要删除指定缺失数据。

删除缺失值的方法:dropna(axis)

  • 默认参数axis = 0,为删除行数据,当参数axis = 1删除列数据(但是一般不会选择axis=1,如果为1,则直接删除了一整个变量数据)
  • 传入 thresh=n时 保留至少有n个非NaN数据的行
#生成一个表格型二维数组
df2=pd.DataFrame([[1,2,3],['juejin',np.nan,np.nan],['a','b',np.nan],[np.nan,np.nan,np.nan],['d','j','h']],
                 columns=list('ABC'))
print(df2,'\n')
#删除所有存在缺失值的行
print(df2.dropna(),'\n')
#删除部分存在缺失值的行,保留至少有n个非NaN数据的行(比如保留至少有一个非NaN数据的行)
print(df2.dropna(thresh=1),'\n')
#删除某一列存在缺失值的行(删除A列里存在缺失值的所有的行,和上面的布尔值序列筛选相同)
print(df2[df2['A'].notnull()])复制代码

输出如下:

A    B    C
0       1    2    3
1  juejin  NaN  NaN
2       a    b  NaN
3     NaN  NaN  NaN
4       d    j    h 

   A  B  C
0  1  2  3
4  d  j  h 

        A    B    C
0       1    2    3
1  juejin  NaN  NaN
2       a    b  NaN
4       d    j    h 

        A    B    C
0       1    2    3
1  juejin  NaN  NaN
2       a    b  NaN
4       d    j    h复制代码

缺失值填充/替换

填充方法:fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)

  • value参数:填充值
  • method参数: pad / ffill → 用之前的数据填充,backfill / bfill → 用之后的数据填充

替换方法:replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad', axis=None)

  • to_replacec参数:被替换的值
  • value参数:替换值

使用举例如下:

import copy
df3=pd.DataFrame([[1,2,3],['juejin',np.nan,np.nan],['a','b',np.nan],['k',np.nan,np.nan],['d','j','h']],
                 columns=list('ABC'))
df4=copy.deepcopy(df3)
print(df3,'\n')
#缺失值全部用 0 填充
print(df3.fillna(0),'\n')
#method=‘pad’,使B列每一个缺失值用缺失值的前一个值填充
df3['B'].fillna(method='pad',inplace=True)
print(df3,'\n')
#用replace替换
print(df4,'\n')
df4.replace(np.nan,'juejin',inplace = True)
print('将缺失值替换为juejin\n',df4)复制代码
A    B    C
0       1    2    3
1  juejin  NaN  NaN
2       a    b  NaN
3       k  NaN  NaN
4       d    j    h 

        A  B  C
0       1  2  3
1  juejin  0  0
2       a  b  0
3       k  0  0
4       d  j  h 

        A  B    C
0       1  2    3
1  juejin  2  NaN
2       a  b  NaN
3       k  b  NaN
4       d  j    h 

        A    B    C
0       1    2    3
1  juejin  NaN  NaN
2       a    b  NaN
3       k  NaN  NaN
4       d    j    h
将缺失值替换为juejin
         A       B       C
0       1       2       3
1  juejin  juejin  juejin
2       a       b  juejin
3       k  juejin  juejin
4       d       j       h复制代码

缺失值插值

上面讲到缺失值的填充,但是在实际的数据处理过程中,对于缺失值的处理不是随便找个数据全部填充,而是有针对性的对每个局部缺失值进行插值填充。

这里选择几种常用的具有代表性的缺失值插值方法:

  • 中位数/众数/平均值插值
  • 临近值插值
  • 拉格朗日值插值
中位数/众数/平均值插补
#生成一个一维数组
s1=pd.Series([6,4,2,5,4,3,3,7,np.nan,3,9,np.nan,1])
print(s1,'\n')
med=s1.median()#中位数
mod=s1.mode()#众数
avg=s1.mean() #平均值
print('中位数,众数,平均数分别为:%.2f,%.2f,%.2f'%(med,mod,avg))
#以平均值为例
s1.fillna(avg)复制代码
0     6.0
1     4.0
2     2.0
3     5.0
4     4.0
5     3.0
6     3.0
7     7.0
8     NaN
9     3.0
10    9.0
11    NaN
12    1.0
dtype: float64 

中位数,众数,平均数分别为:4.00,3.00,4.270     6.000000
1     4.000000
2     2.000000
3     5.000000
4     4.000000
5     3.000000
6     3.000000
7     7.000000
8     4.272727
9     3.000000
10    9.000000
11    4.272727
12    1.000000
dtype: float64复制代码

临近值插补

这点其实在上面缺失值填充里提到了,主要是method这个参数,可选择缺失值位置前一个或者和一个位置上数据填充相同的数据即可,可参考df3

fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)

method参数: pad / ffill → 用之前的数据填充,backfill / bfill → 用之后的数据填充

拉格朗日插值法

许多实际问题中都用函数来表示某种内在联系或规律,而不少函数都只能通过实验和观测来了解。如对实践中的某个物理量进行观测,在若干个不同的地方得到相应的观测值,拉格朗日插值法可以找到一个多项式,其恰好在各个观测的点取到观测到的值。这样的多项式称为 拉格朗日(插值)多项式 。数学上来说,拉格朗日插值法可以给出一个恰好穿过二维平面上若干个已知点的多项式函数。

限于篇幅,这里就粗糙的讲解一下拉格朗日插值法的计算过程

根据数学知识,对于平面上已知的n个点,可以找到一个n-1次多项式:

数据分析—缺失值处理

当我们知道前面的n-1个坐标点(x1,y1),(x2,y2)......(xn-1,yn-1)的值时,代入上面公式可以得到如下的一个多元方程

数据分析—缺失值处理

通过这个多元方程,我们就可以计算出参数a0,a1,.....an-1的值,知道了这个多元方程的各个参数,也就是知道了一个y与x之间的函数方程,传入x值,就可以计算出对应的缺失的y值(一个近似值),形如上面计算值得过程叫做拉格朗日插值法。

在python里,有一个十分方便计算拉格朗日插值的工具库,具体使用和实现过程直接在下面代码里举例实现

我们随意选择一组数据(3,6)、(7,9)、(8,5)、(9,8)利用拉格朗日插值法算出过这些点的函数方程,然后输入我们需要插值的x的值,自然可以得到y值。

#导入拉格朗日插值法计算和作图包
from scipy.interpolate import lagrange
import matplotlib.pyplot as plt
% matplotlib inline
#任意创建一个有缺失值的二维数组
s2=pd.DataFrame({'x':[3,7,12,8,9],'y':[6,9,np.nan,5,8]})
#x值
x=[3,7,8,9]
#y值
y=[6,9,5,8]
#生成这几个点的散点图
plt.scatter(x,y)
#求出函数方程
print(lagrange(x,y))
#选择一个x=12,计算插入值
print('插值12为%.2f' % lagrange(x,y)(12))复制代码

生成的函数(上面的数字3和2表示x³和x²)、对应的缺失值插值、散点图如下:

3        2
0.7417 x - 14.3 x + 85.16 x - 140.8

插值12为103.50

复制代码

所以x=12时,对应的缺失值可以用103.50来插入代替


以上所述就是小编给大家介绍的《数据分析—缺失值处理》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

网络多人游戏架构与编程

网络多人游戏架构与编程

格雷泽 (Joshua Glazer)、马达夫 (Sanjay Madhav) / 王晓慧、张国鑫 / 人民邮电出版社 / 2017-10-1 / CNY 109.00

本书是一本深入探讨关于网络多人游戏编程的图书。 全书分为13章,从网络游戏的基本概念、互联网、伯克利套接字、对象序列化、对象复制、网络拓扑和游戏案例、延迟、抖动和可靠性、改进的延迟处理、可扩展性、安全性、真实世界的引擎、玩家服务、云托管专用服务器等方面深入介绍了网络多人游戏开发的知识,既全面又详尽地剖析了众多核心概念。 本书的多数示例基于C++编写,适合对C++有一定了解的读者阅读。本......一起来看看 《网络多人游戏架构与编程》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换