簡體   English   中英

將每個值除以其組的平均值

[英]Divide each value by its group's average

在 pyspark 如何創建第二列,其中第一列的每個值除以其組的平均值?

這意味着您按另一列進行一些平均分組,然后將每個值除以其組的平均值。

但是,當您對松散的行進行分組時,就會出現問題。 我該如何解決? 例子:

Name value 
A    5
B    1
A    3
A    4
B    1

我想實現這個新的df

Name value  result
A    5      5/4
B    1      1
A    3      3/4
A    4      1
B    1      1

因為 A 組和 B 組的平均值分別為 4 和 1。

使用 window function。 小心除以零。

from pyspark.sql.window import Window
from math import nan
import pyspark.sql.functions as func

list = [('A', 5), ('B', 1), ('A', 3), ('A', 4), ('B', 1), ('C', 0)]
df = sqlContext.createDataFrame(list, ['name', 'value'])
df.withColumn("avg", func.avg(df["value"]).over(Window.partitionBy(df["name"]))) \
  .withColumn("result", func.col("value") / func.col("avg")) \
  .drop("avg") \
  .show()

+----+-----+------+
|name|value|result|
+----+-----+------+
|   A|    5|  1.25|
|   A|    3|  0.75|
|   A|    4|   1.0|
|   B|    1|   1.0|
|   B|    1|   1.0|
|   C|    0|  null|
+----+-----+------+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM