【发布时间】:2016-03-31 14:15:51
【问题描述】:
如果我们有一个由一列类别和一列值组成的 Pandas 数据框,我们可以通过执行以下操作来删除每个类别中的平均值:
df["DemeanedValues"] = df.groupby("Category")["Values"].transform(lambda g: g - numpy.mean(g))
据我了解,Spark 数据帧不直接提供这种分组/转换操作(我在 Spark 1.5.0 上使用 PySpark)。那么,实现这种计算的最佳方法是什么?
我尝试使用 group-by/join 如下:
df2 = df.groupBy("Category").mean("Values")
df3 = df2.join(df)
但它非常慢,因为据我了解,每个类别都需要对 DataFrame 进行全面扫描。
我认为(但尚未验证)如果我将 group-by/mean 的结果收集到字典中,然后在 UDF 中使用该字典,如下所示:
nameToMean = {...}
f = lambda category, value: value - nameToMean[category]
categoryDemeaned = pyspark.sql.functions.udf(f, pyspark.sql.types.DoubleType())
df = df.withColumn("DemeanedValue", categoryDemeaned(df.Category, df.Value))
有没有一种惯用的方式来表达这种类型的操作而不牺牲性能?
【问题讨论】:
标签: python pandas apache-spark pyspark apache-spark-sql