2017-02-22 11 views
1

Используя этот код, чтобы найти модальный:Объединение нескольких функций GroupBy в 1

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

которая возвращает:

enter image description here

Так модальный c1 & c2 являются 2,0 и 3,0 соответственно

Может ли это быть применено ко всем столбцам c1,c2,c3,c4,c5 в dataframe вместо явного выбора каждого столбца, как я сделал?

ответ

1

Похоже, вы используете встроенный max, а не функцию SQL.

import pyspark.sql.functions as F 

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

Чтобы найти режим по нескольким столбцам одного и того же типа можно перекроить долго (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| 
+--------+-----+ 
Смежные вопросы