Combining multiple groupBy functions into 1

纵然是瞬间 提交于 2019-12-11 06:08:38

问题


Using this code to find modal :

import numpy as np
np.random.seed(1)

df2 = sc.parallelize([
    (int(x), ) for x in np.random.randint(50, size=10000)
]).toDF(["x"])

cnts = df2.groupBy("x").count()
mode = cnts.join(
    cnts.agg(max("count").alias("max_")), col("count") == col("max_")
).limit(1).select("x")
mode.first()[0]

from Calculate the mode of a PySpark DataFrame column?

returns error :

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-53-2a9274e248ac> in <module>()
      8 cnts = df.groupBy("x").count()
      9 mode = cnts.join(
---> 10     cnts.agg(max("count").alias("max_")), col("count") == col("max_")
     11 ).limit(1).select("x")
     12 mode.first()[0]

AttributeError: 'str' object has no attribute 'alias'

Instead of this solution I'm attempting this custom one:

df.show()

cnts = df.groupBy("c1").count()
print cnts.rdd.map(tuple).sortBy(lambda a: a[1], ascending=False).first()

cnts = df.groupBy("c2").count()
print cnts.rdd.map(tuple).sortBy(lambda a: a[1] , ascending=False).first()

which returns :

So modal of c1 & c2 are 2.0 and 3.0 respectively

Can this be applied to all columns c1,c2,c3,c4,c5 in dataframe instead of explicitly selecting each column as I have done ?


回答1:


It looks like you're using built-in max, not a SQL function.

import pyspark.sql.functions as F

cnts.agg(F.max("count").alias("max_"))

To find mode over multiple columns of the same type you can reshape to long (melt as defined in Pandas Melt function in Apache Spark):

(melt(df, [], df.columns)
    # Count by column and value
    .groupBy("variable", "value")
    .count()
    # Find mode per column
    .groupBy("variable")
    .agg(F.max(F.struct("count", "value")).alias("mode"))
    .select("variable", "mode.value"))
+--------+-----+
|variable|value|
+--------+-----+
|      c5|  6.0|
|      c1|  2.0|
|      c4|  5.0|
|      c3|  4.0|
|      c2|  3.0|
+--------+-----+


来源:https://stackoverflow.com/questions/42396932/combining-multiple-groupby-functions-into-1

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!