• 数据准备2 数据清洗2 小案例实战


    数据准备2 数据清洗2 小案例实战

     

    好的数据分析师必定是一名数据清洗高手,没有高质量的数据,就没有高质量的数据挖掘

     

    现有如下数据,然后我们对它进行数据清洗:

     

    我个人进行清洗的原则是,先对列或行进行增加/删除/分割/插入,再对“单元格”进行修整

    • 0.读取原始数据

      import pandas as pd
      
      # 0.读取csv文件
      df = pd.read_excel(r"C:yourpathtofile.xlsx")
      print("原始数据为:")
      print(df)
      print("-----------")
      '''
      数据解读:
      用户信息表
      	是数据导出时的产生的序号
      第0列是原始数据时的序号
      第1列是用户姓名
      第2列是用户年龄
      第3列是用户体重
      第4~6列是男性用户三围
      第7~9列是女性用户三围
      '''
      
    • 1.删除多余列

      df1 = df.drop(axis=1, columns=['	',0], inplace=False)
      print(df1)
      print("-----------")
      
    • 2.删除空行

      print("删除空行:* 'all' : If all values are NA, drop that row or column.")
      df1.dropna(how="all", inplace=True)
      print(df1)
      print("-----------")
      
    • 3.更改列名

      print("更改列名:")
      # 更改全部列名
      df1.columns = ['name', 'age', 'weight', 'male1', 'male2', 'male3', 'female1', 'female2', 'female3']
      print("列名为:", df1.columns.values)
      print("-----------")
      
      # 如果使用print("列名为:"+df1.columns.values),则会在每个元素前都输出"列名为:"
      
    • 4.拆分列

      print("拆分列:")
      df1[['first_name', 'last_name']] = df1['name'].str.split(expand=True)
      # expand=True时pandas会自动为你分成列,expand=False时仅仅是在原有列上分开,不自动分为列
      print(df1)
      print("-----------")
      
    • 5.移动列(并删除多余列)

      print("移动列:")
      df1 = df1.drop(axis=1, columns='name')
      first_name = df1.pop('first_name')
      last_name = df1.pop('last_name')
      df1.insert(0, 'first_name', first_name)
      df1.insert(1, 'last_name', last_name)
      # print(df1)
      pd.set_option('display.max_columns', 10)
      pd.set_option('display.width', 100)
      print(df1)
      # insert时必须要求列名
      print("-----------")
      
    • 6.填充空缺值

      df1['age'].fillna(round(df1['age'].mean(), 2), inplace=True)
      # df1['weight'].fillna(df1['weight'].mean(), inplace=True)
      print(df1)
      # 对weight这样还是str类型的自然不能求平均值,否则报错can only concatenate str (not "int") to str
      print("-----------")
      
    • 7.删除某些列中(可组合)的重复数据(保留第一条)

      print("删除重复数据:")
      # df1.drop_duplicates('last_name', inplace=True)
      df1.drop_duplicates(['first_name', 'last_name'], inplace=True)
      print(df1)
      print("-----------")
      
    • 8.统一单位

      rows_with_lbs = df1['weight'].str.contains('lbs').fillna(False)
      for i, r in df1[rows_with_lbs].iterrows():
          num = int(float(r['weight'][:-3])/2.2)
          df1.at[i, 'weight'] = '{}kgs'.format(num)
      print(df1)
      print("-----------")
      

     

    Fix Error

    在“8.统一单位”可能会出现如下报错

    • (index of the boolean Series and of the indexed object do not match)
      

      原因:因为df1[rows_with_lbs]错写成了df[rows_with_lbs]导致因为df和df1的index不匹配

    • KeyError: 'weight'
      

      原因:df1['weight'].str.contains('lbs')错写成了df['weight'].str.contains('lbs'),因为df的列名没改,程序找不到

    • 要小心df1.at[i, 'weight'] = '{}kgs'.format(num),这里假如写成了df,那么(可能)会修改df的部分weight值 且 不会报错
      

     

  • 相关阅读:
    Java经典逻辑编程50题 (转)
    Programmingbydoing
    前端测试框架jest 简介
    puppeteer入门
    面向对象编程
    Java常识
    JS 变量
    jmeter 压力测试
    jmeter 安装
    Java 数据驱动测试
  • 原文地址:https://www.cnblogs.com/G-Aurora/p/13407668.html
Copyright © 2020-2023  润新知