数据预处理-格式-缺失值-异常值等-附py代码

数据预处理

数据预处理是进行数据分析、数据挖掘、机器学习的必不可少的步骤,涉及字符处理、指标转化、缺失值、异常值处理等很多问题,占用了大量的工作量。

由于其格式往往也是多种多样的,需要具体情况具体分析,本文不做详细探讨,缺失值缺失的原因也有许多种,对应的也有很多种方法进行处理,本文仅仅用以下几个步骤简单处理:

  1. 清除空格、空白,不同缺失、空白字符的统一
  2. 清除格式并对数值型数据转换成float格式
  3. 利用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)

结果如下
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41233157/article/details/108627312