数据清洗挑战Day1 | 手把手教你处理数据集中的缺失值

今天是第一天,任务是处理数据集中的缺失值。操作步骤如下:1、观察数据 2、观察缺失值的数量 3、分析出现缺失值的原因 4、剔除缺失值 5、自动补全缺失值

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

01

观察数据

我们使用的数据集是:旧金山建筑许可证数据集,获取方式见文末哦~

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

# 导入我们使用的模块
import pandas as pd
import numpy as np

# 读取我们的数据
sf_permits = pd.read_csv("../input/building7796/Building_Permits.csv")

# 设置种子
np.random.seed(0) 

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

sf_permits.sample(10) 

02

观察缺失值数量

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

# 获取每一列的缺失值
missing_values_count = sf_permits.isnull().sum()

# 查看前15列的缺失值
missing_values_count[0:15]

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

# 一共有多少缺失值?
total_cells = np.product(sf_permits.shape)
total_missing = missing_values_count.sum()

# 缺失值的百分比
(total_missing/total_cells) * 100

03

分析出现缺失值的原因

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

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

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

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

04

剔除缺失值

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

如果确定想要剔除掉含有缺失值的数据行,可以直接使用 pandas 的 dropna() 方法:sf_permits.dropna() 但是我们得到的结果是 0 rows × 43 columns,因为每一行都存在缺失值!

6、除去含有缺失值的数据列:

# 除去至少有一个缺失值的列
columns_with_na_dropped = sf_permits.dropna(axis=1)

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

print("Columns in original dataset: %d \n" % sf_permits.shape[1])
print("Columns with na's dropped: %d" % columns_with_na_dropped.shape[1])

05

自动补全缺失值

除了直接 drop 掉含有缺失值的行或列,另一个方案是去补全缺失的值。


8、这部分我们先截取一部分 column 的数据进行处理,便于观察。

subset_sf_permits = sf_permits.loc[:,"Street Number Suffix":"Issued Date"].head()
subset_sf_permits

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

subset_sf_permits.fillna(0)

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

subset_sf_permits.fillna(method = "bfill", axis=0).fillna("0")

06

总结

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

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值