在PySpark中使用groupby填充na值

ct3nt3jp  于 2023-10-15  发布在  Spark
关注(0)|答案(2)|浏览(130)

如何在汽车价格栏中填写na值,使用group by version并使用中位数填写这些na值?
我是这样用pandas做的:

median_price=df.groupby("version")["price"].transform("median")

df["price"].fillna(median_price, inplace=True)

但我想不出这个逻辑的pyspark.你能帮帮我吗?

qc6wkl3g

qc6wkl3g1#

有两种方法可以做到这一点
1.使用预定义函数
从pyspark.ml.feature import输入器从pyspark.ml.feature import输入器
imputer = Imputer(inputCols='cars'],outputCols=["{}_imputed”.format(c)for c in 'cars']]).setStrategy(“median”)

在df中添加插补函数

df = imputer.fit(df).transform(df)
现在,DF将有另一列汽车_输入
1.第二种方法基本上需要你得到列的中位数,然后使用
从pyspark.sql导入函数为F
median_value=df.select(F.median(F.col('cars ')df= df.fillna(median_value,subset=' cars ']

x4shl7ld

x4shl7ld2#

pyspark中的等效解决方案是按version分区,然后计算分区上的median价格。最后使用coalesce来填充空值。

W = Window.partitionBy('version')
df1 = df.withColumn('price', F.coalesce('price', F.median('price').over(W)))

举例来说

df.show()
+-------+-----+
|version|price|
+-------+-----+
|      a|  1.5|
|      a|  2.0|
|      a| null|
|      b|  7.0|
|      b|  9.0|
|      c|  1.0|
+-------+-----+

df1.show()
+-------+-----+
|version|price|
+-------+-----+
|      a|  1.5|
|      a|  2.0|
|      a| 1.75|
|      b|  7.0|
|      b|  9.0|
|      c|  1.0|
+-------+-----+

相关问题