Dataframe 如何用pyspark中的平均值替换异常值?
我想知道如何用平均值替换异常值。我有dataframe,我可以找到异常值并过滤行,现在我想用平均值替换它。我该怎么做 df类似于:Dataframe 如何用pyspark中的平均值替换异常值?,dataframe,apache-spark,pyspark,apache-spark-sql,outliers,Dataframe,Apache Spark,Pyspark,Apache Spark Sql,Outliers,我想知道如何用平均值替换异常值。我有dataframe,我可以找到异常值并过滤行,现在我想用平均值替换它。我该怎么做 df类似于: a b 1 27 0 2 10 1 3 80 2 4 21 3 5 46 4 6 100 5 在找到IQR后,我得到异常值,如下所示: Upper = 75 lower = 12 outliers = df.filter((df['a'] >
a b
1 27 0
2 10 1
3 80 2
4 21 3
5 46 4
6 100 5
在找到IQR后,我得到异常值,如下所示:
Upper = 75
lower = 12
outliers = df.filter((df['a'] > upper) | (df['a'] < lower))
2 10 1
3 80 2
6 100 5
现在我不明白如何通过将其四舍五入到31来替换平均值,并用pyspark中的异常值替换它。您可以使用给定条件来使用何时替换异常值。要替换为均值,可以使用均值窗口函数,而不是将其收集到变量,然后使用F.round将其四舍五入到最接近的整数:
您可以使用when来使用给定条件替换异常值。要替换为均值,可以使用均值窗口函数,而不是将其收集到变量,然后使用F.round将其四舍五入到最接近的整数:
谢谢你的帮助。你能分享一下关于这个的链接吗?我想了解什么是F.litdoing@toi您可以看到相关的orderBylit1只是窗口的一个伪排序列。必须为mean spark sql函数提供一个窗口,但您希望获得整个数据帧的平均值,因此可以使用虚拟窗口。对于注释代码中的第二个lit函数,它将收集的平均值转换为一列,然后将其舍入并转换为整数谢谢帮助。你能分享一下关于这个的链接吗?我想了解什么是F.litdoing@toi您可以看到相关的orderBylit1只是窗口的一个伪排序列。必须为mean spark sql函数提供一个窗口,但您希望获得整个数据帧的平均值,因此可以使用虚拟窗口。对于注释代码中的第二个lit函数,它将收集的平均值转换为一列,然后将其舍入并转换为整数
from pyspark.sql.functions import mean as _mean, col
mean= df.select(_mean(col('a')).alias('mean')).collect()
mean = mean[0]['mean']
mean : 31.333
from pyspark.sql import functions as F, Window
upper = 75
lower = 12
df2 = df.withColumn(
'a',
F.when(
(df['a'] > upper) | (df['a'] < lower),
F.round(F.mean('a').over(Window.orderBy(F.lit(1)))).cast('int')
# or you can use
# F.round(F.lit(df.select(F.mean(F.col('a')).alias('mean')).collect()[0]['mean'])).cast('int')
).otherwise(F.col('a'))
)
df2.show()
+---+---+
| a| b|
+---+---+
| 27| 0|
| 47| 1|
| 47| 2|
| 21| 3|
| 46| 4|
| 47| 5|
+---+---+