小象学院_数据分析_第6关 洗掉观看记录中的脏数据_笔记

1.缺失值判断:
isnull():得到的是一个与源数据同样行列维度的DataFrame,结果元素的值由True和False组成,当结果元素值为True时,表示源数据中对应位置上包含了空值。
在这里插入图片描述

  • 当数据量较大的时候,我们可以借助方法any(),让结果更加简洁:
    在这里插入图片描述

  • 如果我们希望按行进行统计,可以将any()的axis参数指定为1:
    在这里插入图片描述
    2.缺失值处理:
    丢弃或填充。

  • 丢弃缺失值:dropna():
    (1)包含空值的行全都被删除了;
    (2)dropna()不会修改原始DataFrame中的数据,如果希望dropna()方法能对原始DataFrame进行修改,可以指定dropna()的inplace参数。

 log_data.dropna(inplace = True)

(3)可能只需判断到关键列中有值缺失时,才会删除整行。使用参数:subset
举例:

# 只通过判断volume列是否为空值来决定删除与否
log_data.dropna(inplace = True, subset = ['volume'])
  • 填充缺失值:fillna

(1)使用-1填充空值:log_data.fillna(-1)
(2)fillna()同样支持inplace参数,意义与前面介绍的dropna()中的inplace参数一样,当指定为True时,修改会直接作用于原始数据变量
(3)不同的字段填充不同的值:

 `log_data.fillna({'paused':-1, 'volume': -100})`

(4)向前填充:ffill(),向后填充:bfill()。
(5) 需要符合具体的业务场景。举例:
场景是用户视频观看的相关数据,在用户与时间联合的维度排序上才具有合理的前后关系。也就是说,同一个用户,行为记录按时间从小到大排序后,他记录中的音量值才“极有可能”与前面是相等的。所以,做ffill()操作的正确姿势,应该是先对数据按[‘user’,‘time’]联合排序之后,再做填充

# 对数据进行排序
sorted_log_data = log_data.sort_values(by=['user', 'time'])

# 使用ffill对sorted_log_data做前向填充
sorted_log_data.ffill()

3.处理重复数据

  • 重复数据判断:duplicated()
    duplicated()的执行结果是Series类型的,它的索引是原来DataFrame的行索引,值表示索引对应的行是否是重复的。True表示该行重复,False表示不重复。结果中所有元素值都是False,表示log_data中没有重复数据

在实际项目中,有可能存在这样的场景:当两行数据的某些列元素内容相同时,就被视为重复。这时,我们可以在调用duplicated()方法时根据需求给subset参数赋值,指定某些列作为重复判断的依据:

log_data.duplicated(subset = ['user', 'time'])

  • 重复数据处理
    (1)drop_duplicates()默认会判断重复数据,保留第一条并将剩余的重复行删除;
    (2)根据某些列而不是所有列的值进行判断,可以使用subset参数:log_data.drop_duplicates(subset=['time','user'])
    (3)drop_duplicates()默认保留重复数据中的第一条,当我们希望保留最后一条时,可以在调用drop_duplicates()时将参数keep指定为’last’
# 根据time、user两列判断数据是否重复并将重复数据行删除,保留重复数据中的最后一条
log_data.drop_duplicates(subset = ['user', 'time'], keep='last')

4.处理无效数据

replace()无效对数据进行替换;

# 将数据中的60替换为10
log_data.replace(60, 10)

# 将数据中的30和60都替换为10
log_data.replace([30, 60], 10)

# 将数据中的30替换为5,60替换为10
log_data.replace([30, 60], [5, 10])
#或者:
log_data.replace({30:5, 60:10})

# 指定列替换:将volume列的30替换为5,60替换为10
log_data.replace({'volume':{30:5, 60:10}})

练习:

# 将volume列中的30替换为5,60替换为10
log_data.replace({'volume':{30:5, 60:10}}, inplace = True)
# 按照user、time两列进行联合排序后,使用ffill对空值进行填充
log_data.sort_values(by=['user', 'time'], inplace = True)
log_data.ffill(inplace = True)
# 删除重复值,user、time列完全相等的两行视为重复
log_data.drop_duplicates(inplace = True, subset = ['user', 'time'])
# 显示最后结果
log_data
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值