前些天报名参加了 Kaggle 的 Data Cleaning 5天挑战,5天的任务如下:

  • Day 1: Handling missing values
  • Day 2: Data scaling and normalization
  • Day 3: Cleaning and parsing dates
  • Day 4: Fixing encoding errors (no more messed up text fields!)
  • Day 5: Fixing inconsistent data entry & spelling errors

今天是第一天,任务是处理数据集中的缺失值。活动的主持人 Rachael Tatman 给出的操作步骤如下:

  1. Take a first look at the data
  2. See how many missing data points we have
  3. Figure out why the data is missing
  4. Drop missing values
  5. Filling in missing values

我们一步一步来进行操作~


1、观察数据

首先我们在 notebook 中加载需要清理的数据集,数据集的位置可以在本地也可以在服务器上。今天官方例子中的数据集是关于美国橄榄球比赛的,然后我们动手去做的是关于旧金山建筑许可证的数据集。

引入 pandas 和 numpy 包,从给出的路径读数据集,

# modules we'll use
import pandas as pd
import numpy as np# read in all our data
sf_permits = pd.read_csv("../input/building-permit-applications-data/Building_Permits.csv")# set seed for reproducibility
np.random.seed(0)

然后用 sample(10) 方法随机抽取数据集中的 10 条数据,结果中有很多数据格被标记了 "NaN" ,这些就是我们需要处理的缺失值。

sf_permits.sample(10)


2、观察缺失值的数量

现在我们知道了数据集中存在缺失值,再来看看每一个 column 下缺失值的具体数量(由于 column 过多我们只选了前 15 列)。

# get the number of missing data points per column
missing_values_count = sf_permits.isnull().sum()# look at the # of missing points in the first ten columns
missing_values_count[0:15]

然后可以进一步看看数据集中缺失值的数目占总数的百分比,结果约为 26.26%,四分之一的数据都缺失了!

# how many total missing values do we have?
total_cells = np.product(sf_permits.shape)
total_missing = missing_values_count.sum()# percent of data that is missing
(total_missing/total_cells) * 100


3、分析出现缺失值的原因

这一部分的重点之一是我们对数据的直觉,Rachael 所用的说法是 "data intuition",也就是说我们需要搞清楚我们面对的数据集为什么如此,以及对我们后续的数据分析会有什么样的影响。由于缺乏经验,入门者这部分可能比较困扰。我们需要考虑的问题之一是:

某个数据的缺失是因为它没有被记录还是根本不存在?

如果一个数据值缺失是因为它根本不存在,那么我们就没有必要去猜它可能的值,我们需要做的就是让它继续为 NaN;如果一个数据值缺失是因为没有被记录,我们就应该基于与它同行同列的其他值,来猜想它的可能值。

拿当前的数据集做例子,我们来看一下 Street Number Suffix 和 Zipcode 的缺失值:

missing_values_count = sf_permits.isnull().sum()
missing_values_count[['Street Number Suffix', 'Zipcode']]

我们看到 Street Number Suffix 下有大量缺失值,由于它对地址来说并不是一个普遍存在的数据,所以我猜想它的缺失值根本不存在;有少量的 Zipcode 数据缺失,由于每个地址的邮编一定存在,所以它应该是没有被记录。


4、剔除缺失值

如果你实在急于做分析,可以采取的方案之一就是剔除掉任何包含缺失值的行或列。但这种方法是并不推荐,要想得到更好的分析结果,还是要先合理地处理缺失值。

如果确定想要剔除掉含有缺失值的数据行,可以直接使用 pandas 的 dropna() 方法:

# remove all the rows that contain a missing value
sf_permits.dropna()

但是我们得到的结果是 0 rows × 43 columns,因为每一行都存在缺失值!

再剔除含有缺失值的数据列:

# remove all columns with at least one missing value
columns_with_na_dropped = sf_permits.dropna(axis=1)
columns_with_na_dropped.head()

看一下剔除空值前后的 column 数目对比:

# just how much data did we lose?
print("Columns in original dataset: %d \n" % sf_permits.shape[1])
print("Columns with na's dropped: %d" % columns_with_na_dropped.shape[1])


5、自动补全缺失值

除了直接 drop 掉含有缺失值的行或列,另一个方案是去补全缺失的值。这部分我们先截取一部分 column 的数据进行处理,便于观察。

# get a small subset of the sf_permits dataset
subset_sf_permits = sf_permits.loc[:,"Street Number Suffix":"Issued Date"].head()
subset_sf_permits

如果数据的类型都是数字,我们可以考虑把所有的缺失值都填为 0:

# replace all NA's with 0
subset_sf_permits.fillna(0)

但该数据集中,有 string 型的数据,还有另一种选择就是将空值置为与它相邻的下一行对应的数据,没有下一行数据就置为 0:

# comes directly after it and then
subset_sf_permits.fillna(method = "bfill", axis=0).fillna("0")

处理不同类型的数据集,需要采取不同的方法,还可以用相应 column 的平均值来补全该列的缺失值等。

这就是 5 Day Challenge 第一天的内容,总地来说是非常基础的清洗数据方法,完毕~

欢迎关注我的知乎专栏【数据池塘】,专注于分享机器学习、数据挖掘相关内容:https://zhuanlan.zhihu.com/datapool

⬇️ 扫描下方二维码关注公众号【数据池塘】 ⬇️

回复【算法】,获取最全面的机器学习算法网络图:

Kaggle 数据清洗挑战 Day 1 - 手把手教你五步处理缺失值相关推荐

  1. 竞赛数据清洗缺失值_Kaggle 数据清洗挑战 Day 1 - 手把手教你五步处理缺失值

    前些天报名参加了 Kaggle 的 Data Cleaning 5天挑战,5天的任务如下: Day 1: Handling missing values Day 2: Data scaling and ...

  2. birt报表表格边框_手把手教你五步制作出一张领导驾驶舱报表

    领导驾驶舱报表是一款为企业内部领导及相关高管提供企业数据指标分析的报表,用来实时反映企业的运行状况,将企业管理决策提升到一个新的高度. 今天小编用亿信华辰的亿信ABI给大家实际演示,通过5个步骤就可以 ...

  3. Kaggle 数据清洗挑战 Day 5 - 处理不一致数据

    今天是 Kaggle 数据清洗挑战的第五天,转眼最后一天啦!这次任务是处理拼写不一致的数据,例如"康涅狄格州"可能被记录为 "Connecticut".&quo ...

  4. Kaggle 数据清洗挑战 Day 4 - 字符编码(Character Encoding)处理

    今天是 Kaggle 数据清洗挑战的第四天,任务是对字符进行编码处理- 分为四个部分来学习: Get our environment set up What are encodings? Readin ...

  5. Kaggle 数据清洗挑战 Day 3 - 快速解析日期(date)数据

    今天是 Kaggle 数据清洗挑战的第三天,任务是解析 date 型数据.相信我们都遇到过此类情况,拿到的数据集中有需要分析的日期数据,但它们的类型是 String,不便作图,也不适合作为一个 fac ...

  6. Kaggle 数据清洗挑战 Day 2 - 数据缩放及标准化处理

    今天是 Kaggle 数据清洗挑战的第二天,任务是进行数据缩放(scaling)及标准化处理(normalization),分为四个部分: Get our environment set up Sca ...

  7. 平板电脑如何刷linux,手把手教你六步刷系统

    · 手把手教你六步刷系统 当一切准备就绪后,就可以开始刷机了,首先要用USB2.0接口数据线连接电脑与神舟LiPad T10,然后在关机状态下同时按下上文中介绍的A按键与B按键,这时Windows系统 ...

  8. 步骤分解:教你五步实现css转盘抽奖小游戏

    教你五步实现css转盘抽奖小游戏 先看一下整体效果. 分解思路: 第一步:先画一个园 这里是class="box"代码段 第二步:在圆上面再画一个圆圈,加点阴影效果,有那么点立体的 ...

  9. java调起喇叭,【音响知识】调音不求人 教你五步轻松调出好声音

    原标题:[音响知识]调音不求人 教你五步轻松调出好声音 调音不求人 教你五步轻松调出好声音 有很多车主反映,改装了音响但出来的效果不好,其中还有价格不菲的器材,为改善音质而做的音响改装为何改完后声音也 ...

最新文章

  1. 基于Android5.0的Camera Framework源码分析 (三)
  2. PHP通过header实现文本文件的下载
  3. python获取数据库的存储过程_python远程调用sqlserver存储过程记录
  4. 第一个Android项目
  5. CodeForces - 1480D1 Painting the Array I(贪心)
  6. 李宏毅机器学习课程4~~~分类:概率生成模型
  7. 开源项目葫芦藤:IdentityServer4的实现及其运用
  8. 如何停止运行在服务器的项目,怎么启动和停止服务器
  9. smart700iev3 程序下载设置_分享一款Aira2下载工具
  10. ym—— Android网络框架Volley(终极篇)
  11. 高性能爬虫原理与应用
  12. python生活中可以应用到_学完Python可以应用到工作的哪些应用中?
  13. 好看的热力图seaborn.heatmap配色
  14. openbravo erp介绍(一)
  15. bittorrent_如何匿名和加密您的BitTorrent流量
  16. Python字符串| min()
  17. 对称加密php,PHP实现对称加密与解密
  18. Android高仿网易云音乐播放界面
  19. 当输入 https://www.baidu.com 时,返回页面的过程中发生了什么?
  20. 情人节-程序员的乐趣

热门文章

  1. python 分组箱线图_Python数据科学实践 | 绘图模块4
  2. python网页提交表单_Html表单——使用python在web页面上显示用户提交的数据
  3. 心理与行为科学统计_华东师范大学心理学考研备考经验分享
  4. BUUCTF Web [极客大挑战 2019]Havefun
  5. DVWA-SQL注入(SQL Injection)低/中/高级别
  6. 第13届 广东工业大学ACM程序设计大赛 C题 平分游戏
  7. 共享单车或开启了物联网的大门,新的变革即将开启
  8. NC / Netcat - 文件传输
  9. 《Unix环境高级编程》学习笔记:从点到面
  10. 实现APP-V服务全程跟踪(二)