python处理csv文件缺失值_python处理数据中缺失值

(1)直接删除法(当缺失值个数只占整体很小一部分时)

在采用删除法处理缺失值时,需要首先检测样本总体中确实值得的个数。python中统计缺失值的方法为:

import numpy as np

import pandas as pd

#读取数据,将空值形式的缺失值转换为可识别的类型

data = pd.read_csv('data.csv',encoding='GBK')

#用NaN代替空值

data = data.replace(' ',np,NaN)

print(data.columns)#['id','label','a','b','c','d']

#将每列的缺失值个数统计出来

null_all = data.isnull().sum()

#isnull函数检查数据是否有缺失返回布尔值,元素为空或者NaN返回Ture,否则就是False

#data.isnull().any()判断哪些列包含缺失值,该列存在缺失值则返回True,反之False

#data.isnull().sum()返回每列缺失值的数量

#查看a列缺失值的数据

a_null = data[pd.isnull(data['a'])]

#a列缺失值占的比重

a_ratio = len(data[pd.isnull(data['a'])])/len(data)#0.007

#缺失值所占的比重较小,丢弃缺失值,将存在缺失值的行丢弃

new_drop = data.dropna(axis=0)#(9981,6)

print(new_drop.shape)

#dropna()默认axis=0,删除带有空值的行(只要有一个就删除整行),axis=1删除带有空值的列

#dropna(how='all')整行都是空值时,才会被删除

#dropna(thresh=2),thresh设置阈值,缺失值个数大于该阈值整行(axis=0)或整列(axis=1)才会被删除

#丢弃某几列有缺失值的行

new_drop2 = data.dropna(axis=0,subset=['a','b'])#a和b列没有缺失值,所以不删除元素

print(new_drop2.shape)#(9990,6)

(2)使用一个全局常量填充缺失值

#用0填充缺失值

fill_data = data.fillna(0)

print(fill_data.isnull().sum())

#用一个数字填充缺失值df.fillna(0)

#用前一个数据代替缺失值:method='pad';

#用后一个数据代替缺失值:method='bfill';df.finall(method='bfill')

#用一个字符串代替缺失值,df.fillna('unknow')

#使用描述性统计的值代替缺失值,例如使用平均值代替缺失值

#df.fillna(df.mean())

#finall函数也实现不同的列,用不同的值进行填充,df.finall({1:0.5,3:-1})

#第一列用0.5填充,第三列用-1填充

#fillna默认返回新对象,可以使用inplace参数实现对现有对象直接进行修改

#new_data = df.finall(0,inplace=True)

(3)使用统计数字进行填充

#均值填充

data['a'] = data['a'].finall(data['a'].means())

#中位数填充

data['a'] = data['a'].finall(data['a'].median())

#众数填充

data['a'] = data['a'].finall(stats.mode(data['a'])[0][0])

#用前一个数字填充

data['a'] = data['a'].finall(method='pad')

#用后一个数字填充

data['a'] = data['a'].finall(method='bfill')

Imputer提供了缺失值处理的基本策略,比如使用缺失值所在的行或者列的均值,中位数,众数来代替缺失值

from sklearn.preprocessing import Imputer

imr = Imputer(missing_values='NaN',strategy='mean',axis=0)

imr = imr.fit(data.values)

imputed_data = pd.DataFrame(imr.transform(data.values))

print(imputed_data[0:15])

#strategy默认平均值填充,可选'median'(中位数),'most_frequent'(众数)

#指定轴向axis=0(默认列向);axis = 1,行向

#copy 默认True:创建数据集的副本;False:在任何地方都可以进行插值

(4)插值法,KNN填充

4.1 插值法

Interpolate()插值法,计算缺失值前一个和后一个值的平均数

data['a'] = data['a'].interpolate()

4.2 KNN填充

from fancyimpute import KNN

fill_knn = KNN(k=3).fit_transform(data)

data = pd.DataFrame(fill_knn)

print(data.head())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值