• 【ML】数据清洗


    之前听别人说,一个好的数据分析师80%的时间都花在数据清洗上,一个高质量的数据集才能支撑的了接下来的数据分析和应用。

    什么是好的数据质量呢,我认为只要满足俩个方面就可以了:

    1.完整:比如说 缺值少值,值不完整,NAN之类

    2.合法:数据的类型,内容,大小是符合该特征的。比如,一个年龄的特征值不可能出现小数,也不可以是“张三”。

    如何进行数据清洗:

    填充

    这一步通常用于处理缺失值。这是一个比较尴尬的问题,缺失值和的存在会使得数据稀疏,而补全值也会影响准确性。比如说,我们使用当前列的均值,或者使用当前列出现频率最高的数据用于处理,但是如果整个样本中老年人比较多,而缺失的这个人又是个婴儿,那么这个处理就和现实有偏差了。

    #对年龄空值进行均值填充
    df['Age'].fillna(df['Age'].mean(), inplace=True)

    删除:

    如果一列或者一行数据中只有NAN,NAN占了大多数,数据质量很差,那么我们可以把这一行删掉。

    需要注意的一点是,pandas的read_csv()并没有可选参数来忽略空行,因此我们需要在数据读入进去以后再使用dropna()进行处理,删除空行。

    #把空行删掉
    df.dropna(how='all',inplace=True) 

    或者遇到重复数据,比如一个人被记录了多次,可以把多余的数据删掉。

    # 删除重复数据行
    df.drop_duplicates(['first_name','last_name'],inplace=True)

    替换:

    比如,如有有一列的数据不合法,weight的数值哟肚饿单位是Kg,有的是lbs,那么就要统一单位。

    # 获取 weight 数据列中单位为 lbs 的数据
    rows_with_lbs = df['weight'].str.contains('lbs').fillna(False)
    # 将 lbs转换为 kgs, 2.2lbs=1kgs
    for i,lbs_row in df[rows_with_lbs].iterrows():
        # 截取从头开始到倒数第三个字符之前,即去掉lbs。
        weight = int(float(lbs_row['weight'][:-3])/2.2)
        df.at[i,'weight'] = '{}kgs'.format(weight) 

    比如,删掉非ASCII字符。

    # 删除非 ASCII 字符
    df['name'].replace({r'[^x00-x7F]+':''}, regex=True, inplace=True)

    拆列:

    这个通常用于构造新的特征,比如方差,平均数等等,或者把有一列多参数分开。

    比如把名字分成名和姓。

    # 切分名字,删除源数据列
    df[['first_name','last_name']] = df['name'].str.split(expand=True)
    df.drop('name', axis=1, inplace=True)
  • 相关阅读:
    装饰者模式
    Linux 编译的一些注意参数
    CodeBlocks使用静态链接库
    [BOOST] BOOST::String
    [BOOST] BOOST::Regex
    如何启动仿真环境里的网络联接?
    BlackCore
    Silverlight 中为Dialog添加委托
    c# windows应用程序或C# 控制台应用程序 添加web引用步骤
    Hyperv Server Q&A
  • 原文地址:https://www.cnblogs.com/guangluwutu/p/12363659.html
Copyright © 2020-2023  润新知