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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章