数据清洗

前面我们简单的介绍了数据采集,现在假设我们有了数据了,那是不是就可以直接做数据分析了呢?别着急,我们采集得到的数据往往没有那么完美,还需要一个特别关键的步骤,那就是数据清洗。
先说一下数据清洗的几条规则:
1.完整性: 对于现有的数据,我们需要判断单条数据的完整性,需要统计的字段是否完善。
2.全面性: 观察某一列的全部数值,比如在Excel表中,我们选中一列,可以看到该列的平均值、最大值、最小值。我们可以通过常识来判断该列是否有问题,比如:数据定义、单位标识、数值本身。
3.合法性: 数据的类型、内容、大小的合法性。比如性别存在未知,年龄查过150等
4.唯一性: 数据是否存在重复记录,因为数据通常来自不同渠道的汇总,重复的情况是常见的。行数据、列数据都需要是唯一的,比如一个人不能重复记录多次。

使用我们前面介绍的pandas库来进行数据清洗:
问题1 缺失值

在我们采集到的数据中,有时因为数据没采集到,就会造成数据的缺失,一般对于这种情况,我们有以下三种方法可以解决:
1.直接删除,删除掉数据缺失的记录。
2.采用均值,使用当前列的平均值。
3.采用高频,使用当前列出现频率最高的数据。
示例:
假如小明那一行有数据缺失,我们直接删除:

import pandas
from pandas import Series,DataFrame
df=DataFrame(pandas.read_excel("test.xlsx"))

df = df.drop(index=['小明'])

对df[‘Age’]中缺失的数值用平均年龄进行填充,可以这样写:

df['Age'].fillna(df['Age'].mean(), inplace=True)

如果我们用最高频的数据进行填充,可以先通过value_counts()方法获取Age字段最高频次age_maxf,然后再对Age字段中缺失的数据用age_maxf进行填充:

age_maxf = df['Age'].value_counts().index[0]
df['Age'].fillna(age_maxf, inplace=True)
问题2 空行

如果我们发现出现空行,除了index之外,全部的值都是NaN。pandas的read_csv()并没有可选的参数来忽略空行,这样,我们就需要数据在被读入之后再使用dropna()进行处理来删除空行:

# 删除全空的行
df.dropna(how='all',inplace=True) 
问题3 列数据的单位不统一

假设现在我们有一个weight列的数据,然后现在weight列的单位是不统一的,有的是千克(kgs),有的是磅(lbs)。现在我们想要以千克作为统一的度量单位, 所以要将磅(lbs)转为千克:

# 获取 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)
问题4 非ASCII字符

如果我们的数据集中出现非ascii的字符,我们可以采取删除或者替换的方式来解决这个问题,选择删除:

# 删除非 ASCII 字符
df['first_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)
df['last_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)
问题5 一列有多个参数

假设我们现在的数据集中有一列name中有多个字段的数据,比如有first_name和last_name同在一列中,我们现在想把他们分离出来两列,并把原来的那一列name删掉:

# 切分名字,删除源数据列
df[['first_name','last_name']] = df['name'].str.split(expand=True)
df.drop('name', axis=1, inplace=True)
问题6 重复数据

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

# 删除重复数据行
df.drop_duplicates(['first_name','last_name'],inplace=True)
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值