Dataframe 如何用pyspark中的平均值替换异常值?

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'] >

我想知道如何用平均值替换异常值。我有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'] > 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|
+---+---+