【问题标题】:Combining multiple groupBy functions into 1将多个 groupBy 函数合并为 1
【发布时间】:2019-01-12 21:30:02
【问题描述】:

使用此代码查找模态:

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]

来自Calculate the mode of a PySpark DataFrame column?

返回错误:

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

我正在尝试这个自定义解决方案,而不是这个解决方案:

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()

返回:

所以c1c2的模态分别是2.0和3.0

这可以应用于数据框中的所有列c1,c2,c3,c4,c5,而不是像我一样显式选择每一列吗?

【问题讨论】:

    标签: apache-spark pyspark apache-spark-sql pyspark-sql


    【解决方案1】:

    看起来您使用的是内置 max,而不是 SQL 函数。

    import pyspark.sql.functions as F
    
    cnts.agg(F.max("count").alias("max_"))
    

    要在多个相同类型的列上查找模式,您可以将其整形为 long(melt 定义在 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|
    +--------+-----+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-11
      相关资源
      最近更新 更多