数据缺失处理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())
完整Python测试代码如下:
# -*- coding:utf-8 -*-
# __author__ = "LQ"
from pandas import Series,DataFrame,np
from numpy import nan as NA
import pandas as pd
from scipy.interpolate import lagrange
data=Series([12,None,34,NA,68])
#删除所有带缺失的数据行
data1=data.dropna()
print(data1)
data2=DataFrame(np.random.randn(5,4))
data2.ix[:2,1]=NA
data2.ix[:3,2]=NA
print(data2)
#保留含有两个非空的行
print(data2.dropna(thresh=2))
#保留含有三个非空的行
print(data2.dropna(thresh=3))
#使用0替换所有缺失值
print(data2.fillna(0))
#字典方法对缺失值进行填充
print(data2.fillna({1:11,2:22}))
#平均值替换
print(data2.fillna({1:data2[1].mean(),2:data2.mean()}))
#拉格朗日插值法
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)
#检测后替换异常值
data3=DataFrame(np.random.randn(10,4))
data4=data3[2]
print(data4[np.abs(data4)>1])
#检测大于1的数据,将异常值替换为0.5
data4[np.abs(data4)>1] = 0.5
print(data4)
#移除重复数据
data5=pd.DataFrame({'name':['zhang']*3+['wang']*4,'age':[18,18,19,19,20,20,21]})
print(data5)
#重复判断
print(data5.duplicated())
#去重
print(data5.drop_duplicates())
#去重默认保留前一个,想保留后一个要加一个参数
print(data5.drop_duplicates(keep='last'))
#数据规范化,归一化
data6=Series([18,18,19,19,20,20,21])
#最大最小规范化
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)
#汇总和描述等统计量的计算
df=DataFrame(np.random.randn(4,3),index=list('abcd'),columns=['first','second','third'])
#对数据的基本统计量进行描述,得到每列数据的行数、平均值、协方差、最小值、四分之一分位数、中位数、四分之三分位数、最大值
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())