replace - 用pyspark中的中位数替换空值
问题描述
如何在数据集 df 下方的 Age 和 Height 列中用中位数替换空值。
df = spark.createDataFrame([(1, 'John', 1.79, 28,'M', 'Doctor'),
(2, 'Steve', 1.78, 45,'M', None),
(3, 'Emma', 1.75, None, None, None),
(4, 'Ashley',1.6, 33,'F', 'Analyst'),
(5, 'Olivia', 1.8, 54,'F', 'Teacher'),
(6, 'Hannah', 1.82, None, 'F', None),
(7, 'William',None, 42,'M', 'Engineer'),
(None,None,None,None,None,None),
(8,'Ethan',1.55,38,'M','Doctor'),
(9,'Hannah',1.65,None,'F','Doctor'),
(10,'Xavier',1.64,43,None,'Doctor')]
, ['Id', 'Name', 'Height', 'Age', 'Gender', 'Profession'])
在用平均值替换缺失值的帖子中 - Spark Dataframe 我使用了 pyspark.ml.feature import Imputer 给出的函数
imputer = Imputer(
inputCols=df.columns,
outputCols=["{}_imputed".format(c) for c in df.columns])
imputer.fit(df).transform(df)
它给我一个错误。
IllegalArgumentException:“要求失败:列 ID 的类型必须等于以下类型之一:[DoubleType, FloatType] 但实际上是 LongType 类型。”
所以请帮忙。谢谢
解决方案
这可能是一个初始转换错误(我有一些字符串需要浮动)。要将所有 cols 转换为浮点数,请执行以下操作:
from pyspark.sql.functions import col
df = df.select(*(col(c).cast("float").alias(c) for c in df.columns))
那么你应该可以估算。注意:我将我的策略设置为中值而不是平均值。
from pyspark.ml.feature import Imputer
imputer = Imputer(
inputCols=df.columns,
outputCols=["{}_imputed".format(c) for c in df.columns]
).setStrategy("median")
# Add imputation cols to df
df = imputer.fit(df).transform(df)
推荐阅读
- python - 使用两个字典映射列
- c# - 如何从 MVC 操作方法返回任何类型的文件?
- php - 如何修复 Laravel 批量插入记录仅将第一条记录保存到数据库
- javascript - 是否可以按百分比获取网页加载元素的进度?
- spring - 使用 Spring Data Jpa 保存相反实体时集合未更新
- android - MP4 视频最后一帧
- javascript - chart.js v2.80 默认条形图背景颜色
- gitlab - Gitlab 中的相关问题
- ms-access - 更新主表记录时更新关联记录
- adobe - 需要手动更新indesign上传文件的documentID和InstanceID