missingno

import numpy as np
import pandas as pd
import missingno as msno
%matplotlib inline

FileReadPath = r"D:\AI\Others\test.xlsx"
df = pd.read_excel(FileReadPath)
df.head()

output:

 ABC
0136.0
1247.0
235NaN
3469.0
457NaN

msno.matrix(df)

output:#有缺失值的位置显示为白

<matplotlib.axes._subplots.AxesSubplot at 0x254ad47b780>


一、缺失值的识别

  • 在python中缺失值可以用pandas中的isnull()
import pandas as pd
df = pd.read_csv("C:\\Users\\Administrator\\OneDrive\\步履不停\\评分卡制作\\数据\\GermanCredit.csv",engine='python')
df.isnull().sum()

得到如下结果,可以看到没有缺失值。没办法,这个数据应该是事先被处理过的,方便建模。总之,呵呵。。。。。。

Unnamed: 0                 0
status                     0
duration                   0
credit_history             0
purpose                    0
amount                     0
savings                    0
employment_duration        0
installment_rate           0
personal_status_sex        0
other_debtors              0
present_residence          0
property                   0
age                        0
other_installment_plans    0
housing                    0
number_credits             0
job                        0
people_liable              0
telephone                  0
foreign_worker             0
credit_risk                0
dtype: int64
  • 还可以用missingno这个库图形化缺失值
import missingno
missingno.matrix(data)

那我们可以自己构造数据

import pandas as pd 
from io import StringIO
csv_data='''A,B,C,D
1,2,3,4
5,6,7,8
0,11,12,'''
data = pd.read_csv(StringIO(csv_data))
data
    A   B   C   D
0   1   2   3.0 4.0
1   5   6   NaN 8.0
2   0   11  12.0NaN
data.isnull().sum()
A    0
B    0
C    1
D    1
dtype: int64

二,将存在缺失值的特征或样本删除

  • 优点:简单方便
  • 缺点:可能会删除过多的样本,导致分析结果可靠性不高
    在python中可以用DataFrame.dropna()方法删除缺失值
#删除存在缺失值的行
data.dropna()
     A  B   C   D
0   1   2   3.0 4.0
data.dropna(axis=1) #删除存在缺失值的列
df.dropna(how='all') #删除所有列都是缺失值的行
df.dropna(thresh=4) #删除没有至少4个非NaN值的行
df.dropna(subset=['C']) #删除指定列中存在缺失值的行

三,缺失值的填充

在不能剔除缺失值的时候,我们可以使用不同的插值技术,通过数据集中其他训练样本的数据来估计缺失值。对于数值型数据来说,通常使用能代表变量中心趋势的值来填补。通常有平均值,中位数,众数等。选择哪种中心趋势值来填充需要观察变量的分布。因为平均值易受极端值影响,在这中偏态数据中,我们可以用中位数来填充,而在正态分布下我们可以用平均值。对于定性数据来讲,我们可以用众数来填充

http://pandas.pydata.org/pandas-docs/stable/missing_data.html?highlight=fill
在numpy中,缺失值可以用numpy.NaN或者numpy.nan来表示
在scikit-learn中,有可以实现的类-Imputer

In [41]: df2
Out[41]: 
        one       two     three four   five  timestamp
a       NaN  0.501113 -0.355322  bar  False        NaT
c       NaN  0.580967  0.983801  bar  False        NaT
e  0.057802  0.761948 -0.712964  bar   True 2012-01-01
f -0.443160 -0.974602  1.047704  bar  False 2012-01-01
h       NaN -1.053898 -0.019369  bar  False        NaT

In [42]: df2.fillna(0)
Out[42]: 
        one       two     three four   five            timestamp
a  0.000000  0.501113 -0.355322  bar  False                    0
c  0.000000  0.580967  0.983801  bar  False                    0
e  0.057802  0.761948 -0.712964  bar   True  2012-01-01 00:00:00
f -0.443160 -0.974602  1.047704  bar  False  2012-01-01 00:00:00
h  0.000000 -1.053898 -0.019369  bar  False                    0

In [43]: df2['one'].fillna('missing')
Out[43]: 
a     missing
c     missing
e    0.057802
f    -0.44316
h     missing
Name: one, dtype: object

  • 平均值

from sklearn.preprocessing import Imputer
#axis=0,代表用列的均值来进行相应的替换,等于1代表用行的均值来替换
imr = Imputer(missing_values='NaN',strategy='mean',axis=0)
imr.fit(data)
imputed_data = imr.transform(data.values)
imputed_data
  • 中位数
from sklearn.preprocessing import Imputer
imr = Imputer(missing_values='NaN',strategy='median',axis=0)
imr.fit(data)
imputer_data = imr.transform(data.values)
imputer_data
  • 众数
from sklearn.preprocessing import Imputer
imr = Imputer(missing_values='NaN',strategy='most_frequent',axis=0)
imr.fit(data)
imputer_data = imr.transform(data.values)
imputer_data

也可以使用pandas 中的相关方法,具体可以参考这篇文章http://blog.csdn.net/helen1313/article/details/53304641

  • 采用拉格朗日插值法
#构建数据
import numpy as np
sales = pd.DataFrame(data={'sale_money':[3442.1,3393.1,3136.6,3744.1,6607.4,4060.3,3614.7,3295.5,2332.1,2699.3,np.nan,3036.8]})

#导入库
from scipy.interpolate import lagrange #导入拉格朗日插值函数

#过滤异常值,将其变为空值
sales['sale_money'][(sales['sale_money']<400) | (sales['sale_money']>5000)]=None


#自定义函数
##导入拉格朗日插值函数
from scipy.interpolate import lagrange
def ployinterp_columns(s,n,k=5):
    #s为列向量,n为缺失值位置,K为取前后的数据个数。默认为5
    y = s[list(range(n-k,n))+list(range(n+1,n+1+k))] #取数
    y=y[y.notnull()] #剔除空值
    return(lagrange(y.index,list(y))(n))
#逐个列逐个行判断是否需要插值
for i in sales.columns:
    for j in range(len(sales)):
        if(sales[i].isnull())[j]:
            sales[i][j] = ployinterp_columns(sales[i],j)
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值