python实现数据缺失处理

数据缺失处理python函数

数据缺失判断函数isnull()

 data.isnull()

(1)数据过滤(dropna)

数据过滤是将数据直接过滤掉

dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)

parameters 详解
axis default 0指行,1为列
how {‘any’, ‘all’}, default ‘any’指带缺失值的所有行;'all’指清除全是缺失值的行
thresh int,保留含有int个非空值的行
subset 对特定的列进行缺失值删除处理
inplace 这个很常见,True表示就地更改

df.dropna() #删除所有带缺失数据的行

(2)数据填充(fillna)

当数据有缺失值时,用其他值替代

fillna(value,method,axis)

parameters 详解
axis default 0指行,1为列
value 填充值
method 采用填充数值的方法,默认none

df.fillna(0) #用0替换所有的缺失值

(3)拉格朗日插值法

lagrange(y.index, list(y))(n)

(4)检测和过滤异常数据

通过过滤变换发现异常值,然后删除或者替换异常值

(5)移除重复数据

 #重复判断
data5.duplicated()
#去重
data5.drop_duplicates()

(6)数据规范化

主要实现数据归一化

 #最大最小规范化
min=(data6-data6.min())/(data6.max()-data6.min())
print(min)
#零均值规范化
zero=(data6-data6.mean())/data6.std()
print(zero)
#小数定标规范化
float=data6/10**np.ceil(np.log(data6.abs().max()))
print(float)

(7)汇总和描述等统计量的计算

#对数据的基本统计量进行描述,得到每列数据的行数、平均值、协方差、最小值、		四分之一分位数、中位数、四分之三分位数、最大值
print(df.describe())
#统计每列数据的和,axis=1每行数据的和
print(df.sum())
print(df.sum(axis=1))
#统计每列最小数值所在的行,axis=1每行最小所在的列
print(df.idxmin())
print(df.idxmin(axis=1))
#统计每列最大数值所在的行,axis=1每行最大所在的列
print(df.idxmax())
print(df.idxmax(axis=1))
#计算方差
print(df.var())
#计算协方差
print(df.std())
#计算百分数变化
print(df.pct_change())
#计算协方差
print(df.cov())
#计算相关系数
print(df.corr())

完整代码如下:

# -*- coding: utf-8 -*-
"""
Created on Tue Mar 17 15:40:27 2020

@author: 王震
"""
from pandas import Series,DataFrame,np
from numpy import nan as NA
import pandas as pd
from scipy.interpolate import lagrange

data = Series([23,None,35,NA,70])

#数据缺失处理第一种
#删除所有带缺失的数据行
print("删除所有带缺失的数据行")
data_one = data.dropna()
#dropna()数据过滤,将数据直接过滤掉 dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
print(data_one)


data_2 = DataFrame(np.random.randn(5,4))
data_2.ix[:2:2] = NA
data_2.ix[:2:2] = NA
print(data_2)
print("\n")
#保存含有两个非空得行 thresh 表示保存含有几个非空值得行
print("保存含有两个非空得行")
print(data_2.dropna(thresh=2))
#保留含有3个非空得行
print("保留含有3个非空得行")
print(data_2.dropna(thresh=4))

#使用0替换所有缺失得值
print("\n使用0替换所有缺失得值")
print(data_2.fillna(0))
#用字典方法对缺失值进行补充
print("用字典方法对缺失值进行补充")
t = data_2.fillna({0:0,1:2,2:2,3:3})
print(t)
#平均值替换
print("平均值替换")
print(data_2.fillna({1:data_2[1].mean(),2:data_2.mean()}))

#拉格朗日插值法
print("拉格朗日插值法")
df=DataFrame(np.random.randn(20,2),columns=['first','second'])
#过滤异常值,将其变为空值
df['first'][(df['first']<-1.5) | (df['first']>1.5)] = None
print(df)

#插值函数
def ployinterp_column(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 df.columns:
    for j in range(len(df)):
        if(df[i].isnull())[j]:
            df[i][j] = ployinterp_column(df[i],j)
print(df)

#检测后替换异常值
print("检测后替换异常值")
data_3=DataFrame(np.random.randn(10,4))
data_4=data_3[2]
print(data_4[np.abs(data_4)>1])
#检测大于1得数据,将异常值替换为0.5
print("检测大于1得数据,将异常值替换为0.5")
data_4[np.abs(data_4)>1] = 0.5
print(data_4)

#删除重复数据
print("删除重复数据")
data_5=pd.DataFrame({'name':['wang']*5+['zhen']*4,'age':[11,11,11,13,15,15,21,21,21]})
print(data_5)
#重复判断
print("重复判断")
print(data_5.duplicated())
#去重
print("去重")
print(data_5.drop_duplicates())
#去重默认保留前一个,如果需要保留后一个需要加一个参数
print("去重默认保留前一个,如果需要保留后一个需要加一个参数")
print(data_5.drop_duplicates(keep='last'))

#数据规范化,归一化
print("数据规范化,归一化")
data_6 = Series([10,10,11,11,12,12,13])
#最大最小规范化
print("最大最小规范化")
min=(data_6-data_6.min())/(data_6.max()-data_6.min())
print(min)
#零均值规范化
print("零均值规范化")
zero = (data_6-data_6.mean())/data_6.std()
print(zero)
#小数定标规范化
print("小数定标规范化")
float=data_6/10**np.ceil(np.log(data_6.abs().max()))
print(float)

#汇总和描述等统计量得计算
print("汇总和描述等统计量得计算")
df=DataFrame(np.random.randn(4,3),index=list('abcd'),columns=['first','second','third'])
#对数据的基本统计量进行描述,得到每列数据的行数、平均值、协方差、最小值、四分之一分位数、中位数、四分之三分位数、最大值
print("对数据的基本统计量进行描述,得到每列数据的行数、平均值、协方差、最小值、四分之一分位数、中位数、四分之三分位数、最大值")
print(df.describe())

#统计每列数据得和,axis=1 每行数据得和
print("统计每列数据得和,axis=1 每行数据得和")
print(df.sum())
print(df.sum(axis=1))
#统计每列最小数值所在得行,axis=1每行最小所在得列
print("统计每列最小数值所在得行,axis=1每行最小所在得列")

print(df.idxmin())
print(df.idxmin(axis=1))
#统计每列最大数值所在得行,axis=1每行最大所在的列
print("统计每列最大数值所在得行,axis=1每行最大所在的列")
print(df.idxmax())
print(df.idxmax(axis=1))
#计算方差
print("计算方差")
print(df.var())
#计算协方差
print("计算协方差")
print(df.std())
#计算百分数变化
print("计算百分数变化")
print(df.pct_change())
#计算协方差
print("计算协方差")
print(df.cov())
#计算相关系数
print("计算相关系数")
print(df.corr())






测试效果如图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文参考:https://blog.csdn.net/qq_30868737/article/details/104215760

发布了21 篇原创文章 · 获赞 43 · 访问量 5001

猜你喜欢

转载自blog.csdn.net/weixin_42878211/article/details/104936837