PySpark入门十一:数据清洗之缺失值处理

缺失值处理

在数据清洗中,查看缺失值、处理缺失值是非常重要的一个环节,通常对缺失值的处理是两种策略:删除和填充。接下来一起学习一下在PySpark中如何通过代码实现这两种操作。

首先构建数据
# 导包
from pyspark import SparkContext
from pyspark.sql.session import SparkSession

# 创建连接
sc = SparkContext.getOrCreate()
spark = SparkSession(sc)

# 构造数据
df = spark.createDataFrame([
    (1, 144.5, 5.9, 33, 'M', 1000),
    (2, 167.2, 5.4, 45, 'M', None),
    (3, 124.1, None, None, None, None),
    (4, None, 5.9, None, 'M', None),
    (5, 133.2, 5.7, 54, 'F', 7600),
], ['id', 'weight', 'height', 'age', 'gender', 'income'])
df.show()

在这里插入图片描述
我们构造了一个‘income’ 列基本上全部为缺失值的DF,那么如何通过代码来辨识出缺失值呢?

查找缺失值
# 查找每行缺失的数据
df.rdd.map(lambda row: (row['id'], sum([c == None for c in row]))).collect()

在这里插入图片描述
这里先统计了没一行的缺失值个数,可以发现第三行缺失值个数最多,是4个,打印查看一下是否正确

df.where('id == 3').show()

在这里插入图片描述

处理缺失值

对缺失值的处理有两种策略:删除和填充,那么何时该采取何种策略呢?对于缺失值占比较大的数据,一般直接移除,对数据的总体影响不会太大

# 查看缺失值占比
import pyspark.sql.functions as fn

df.agg(*[(1- (fn.count(c)/ fn.count('*'))).alias(c + 'missing') for c in df.columns]).show()

# count('*') 表示统计列的所有行数  
# agg(*[]) 将该列表作为一组独立的参数传递给函数,可以理解为*arg

在这里插入图片描述
从结果可知,income列空值占比60%,所以我们可以删掉这一列

df_no_income = df.select([c for c in df.columns if c != 'income'])

删除行的重复值

# 删除row 的重复值
df_no_income.dropna(thresh=3).show()

# thresh 允许出现空值的最大次数

在这里插入图片描述
第三行删掉了,因为空值个数>=3

填充空值

填充空值可以填充平均数、中间值、最大或者最小值等,这里我们以填充平均值举例

# 计算每一列的平均值,并生成为一个字典
# 计算均值时排除了gender列,因为是字符串,不能计算均值
means = df_no_income.agg(*[fn.mean(c).alias(c) for c in df_no_income.columns if c != 'gender']).toPandas().to_dict('records')[0]

# 填充‘gender’ 列的空值
means['gender'] = 'missing'

df_no_income.fillna(means).show()

在这里插入图片描述
这里有几个新知识点:
fillna() 参数接收一个字典,或者是单个值;
toPandas() 是把spark的df转换为pandas的df;
to_dict()是把df转换为字典,而参数 records 则指定了如下的格式:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值