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