数据预处理
数据预处理是进行数据分析、数据挖掘、机器学习的必不可少的步骤,涉及字符处理、指标转化、缺失值、异常值处理等很多问题,占用了大量的工作量。
由于其格式往往也是多种多样的,需要具体情况具体分析,本文不做详细探讨,缺失值缺失的原因也有许多种,对应的也有很多种方法进行处理,本文仅仅用以下几个步骤简单处理:
- 清除空格、空白,不同缺失、空白字符的统一
- 清除格式并对数值型数据转换成float格式
- 利用95分位数盖帽法处理异常值,并用均值填充缺失值
代码示例
class cleanDataset():
def __init__(self):
pass
# 清除空格,缺失、空白等统一
def clean_format(self, x):
x = str(x).strip().strip(' ')
if x.lower() in ['null', 'nan', ' ', 'na']:
x = np.NaN
try:
x = float(x)
except Exception as e:
print(e)
return x
# 清除格式并保存数据类型为float
def clean_type(self, dataset, out_vars):
for each in dataset.columns:
if each not in out_vars:
dataset[each] = dataset[each].apply(self.clean_format)
print(dataset[each].head())
try:
dataset[each] = dataset[each].astype(float)
except Exception as e:
print(e)
return(dataset)
# 95分位数盖帽异常值,并用均值填充缺失值
def fillna_value(self,dataset, yname ,filltype):
list_col = [each for each in data.columns if each not in [id, yname]]
for each in list_col:
try:
p95 = np.percentile(dataset[each], 95)
dataset[each] = dataset[each].map(lambda x: p95 if x > p95 else x)
except Exception as e:
pass
if filltype == 'median':
dataset[each] = dataset[each].fillna(dataset[each].median())
elif filltype == 'mean':
dataset[each] = dataset[each].fillna(dataset[each].mean())
elif filltype == 'mode':
dataset[each] = dataset[each].fillna(dataset[each].mode()[0])
return dataset
def main(self, data):
id = 'id'; yname = 'virus_cnt_pct'
out_vars = [id, yname]
data = data[data[yname].notna()]
dataset = self.clean_type(data, out_vars);
dataset = self.fillna_value(dataset, yname, 'mean')
return dataset
if __name__ == '__main__':
cleanDataset().main(data)
结果如下