• 数据分析实战(11)-数据清洗(使用pandas)


    11 数据科学家80%时间都花费在了这些清洗任务上?

    没有高质量的数据,就没有高质量的数据挖掘,而数据清洗是高质量数据的一道保障。

    数据质量的准则——完全合一

    完整性:单条数据是否存在空值,统计的字段是否完善。

    全面性:观察某一列的全部数值,比如在 Excel 表中,我们选中一列,可以看到该列的平均值、最大值、最小值。我们可以通过常识来判断该列是否有问题,比如:数据定义、单位标识、数值本身。

    合法性:数据的类型、内容、大小的合法性。比如数据中存在非 ASCII 字符,性别存在了未知,年龄超过了 150 岁等。

    唯一性:数据是否存在重复记录,因为数据通常来自不同渠道的汇总,重复的情况是常见的。行数据、列数据都需要是唯一的,比如一个人不能重复记录多次,且一个人的体重也不能在列指标中重复记录多次。

    1. 完整性问题

        1)缺失值:在数据中有些年龄、体重数值是缺失的,这往往是因为数据量较大,在过程中,有些数值没有采集到。

            通常我们可以采用以下三种方法:

            删除:删除数据缺失的记录;

            均值:使用当前列的均值: df['Age'].fillna(df['Age'].mean(), inplace=True) 

            高频:使用当前列出现频率最高的数据。

       2)空行:我们发现数据中有一个空行,除了 index 之外,全部的值都是 NaN。

            Pandas 的 read_csv() 并没有可选参数来忽略空行,删除全空的行: df.dropna(how='all',inplace=True)  

    2. 全面性问题

      1)列数据的单位不统一

    # 将磅(lbs)转化为千克(kgs)
    # 获取 weight 数据列中单位为 lbs 的数据
    rows_with_lbs = df['weight'].str.contains('lbs').fillna(False)
    print df[rows_with_lbs]
    # 将 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) 

    3. 合理性问题

      1)非 ASCII 字符

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

    4. 唯一性问题

        1)一列有多个参数:在数据中不难发现,姓名列(Name)包含了两个参数 Firstname 和 Lastname。

            为了达到数据整洁目的,我们将 Name 列拆分成 Firstname 和 Lastname 两个字段。我们使用 Python 的 split 方法,str.split(expand=True),将列表拆成新的列,再将原来的 Name 列删除。

    # 切分名字,删除源数据列
    df[['first_name','last_name']] = df['name'].str.split(expand=True)
    df.drop('name', axis=1, inplace=True)      #这里的axis=1可以看成是删除列;类比如果是删除的某index行参数要写axis=0

        2)重复数据:我们校验一下数据中是否存在重复记录。如果存在重复记录,就使用 Pandas 提供的 drop_duplicates() 来删除重复数据

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

    作业:清洗这个表格

     步骤一:python导入Excel

    # 步骤一:python导入Excel
    import pandas as pd
    from pandas import Series, DataFrame
    df = pd.read_excel('data.xlsx',engine='openpyxl')
    df.to_excel('food.xlsx')
    print(df)
              food  ounces  animal
    0        bacon     4.0     pig
    1  pulled pork     3.0     pig
    2        bacon     NaN     pig
    3     Pastrami     6.0     cow
    4  corned beef     7.5     cow
    5        Bacon     8.0     pig
    6     pastrami    -3.0     cow
    7    honey ham     5.0     pig
    8     nova lox     6.0  salmon
    #步骤二
    df['food'] = df['food'].str.lower() # 统一为小写字母
    df.dropna(inplace=True) # 删除数据缺失的记录
    df['ounces'] = df['ounces'].apply(lambda a: abs(a)) # 负值不合法,取绝对值
    print(df)
              food  ounces  animal
    0        bacon     4.0     pig
    1  pulled pork     3.0     pig
    3     pastrami     6.0     cow
    4  corned beef     7.5     cow
    5        bacon     8.0     pig
    6     pastrami     3.0     cow
    7    honey ham     5.0     pig
    8     nova lox     6.0  salmon
    #步骤三
    # 查找food重复的记录,分组求其平均值
    d_rows = df[df['food'].duplicated(keep=False)]
    print(d_rows)
    g_items = d_rows.groupby('food').mean()
    print(g_items)
    g_items['food'] = g_items.index
    print(g_items)
           food  ounces animal
    0     bacon     4.0    pig
    3  pastrami     6.0    cow
    5     bacon     8.0    pig
    6  pastrami     3.0    cow
              ounces
    food            
    bacon        6.0
    pastrami     4.5
              ounces      food
    food                      
    bacon        6.0     bacon
    pastrami     4.5  pastrami
    #步骤四
    # 遍历将重复food的平均值赋值给df
    for i, row in g_items.iterrows():
        df.loc[df.food == row.food, 'ounces'] = row.ounces
    print(df)
    df.drop_duplicates(inplace=True) # 删除重复记录
    print(df)
    df.index = range(len(df)) # 重设索引值
    print(df)
              food  ounces  animal
    0        bacon     6.0     pig
    1  pulled pork     3.0     pig
    3     pastrami     4.5     cow
    4  corned beef     7.5     cow
    5        bacon     6.0     pig
    6     pastrami     4.5     cow
    7    honey ham     5.0     pig
    8     nova lox     6.0  salmon
              food  ounces  animal
    0        bacon     6.0     pig
    1  pulled pork     3.0     pig
    3     pastrami     4.5     cow
    4  corned beef     7.5     cow
    7    honey ham     5.0     pig
    8     nova lox     6.0  salmon
              food  ounces  animal
    0        bacon     6.0     pig
    1  pulled pork     3.0     pig
    2     pastrami     4.5     cow
    3  corned beef     7.5     cow
    4    honey ham     5.0     pig
    5     nova lox     6.0  salmon
  • 相关阅读:
    Java学习笔记之——break 和continue
    Java学习笔记之——循环语句
    Java学习笔记之——switch-case条件结构
    Java学习笔记之——if条件语句和三目运算符
    Java学习笔记之——变量与数据类型、运算符
    supervisor-program配置
    应用节点使用管理节点做代理访问互联网的方法
    运营商-技术问题汇总
    galera cluster,mysql配置wsrep_notify_cmd参数,增加邮件告警
    while循环中出现ssh导致读取文件错误
  • 原文地址:https://www.cnblogs.com/foolangirl/p/14285902.html
Copyright © 2020-2023  润新知