from pyspark.sql.functions import monotonically_increasing_id
def get_mode(df):
column_lst = df.columns
res = [df.select(i).groupby(i).count().orderBy("count", ascending=False) for i in column_lst]
df_mode = res[0].limit(1).select(column_lst[0]).withColumn("temp_name_monotonically_increasing_id", monotonically_increasing_id())
for i in range(1, len(res)):
df2 = res[i].limit(1).select(column_lst[i]).withColumn("temp_name_monotonically_increasing_id", monotonically_increasing_id())
df_mode = df_mode.join(df2, (df_mode.temp_name_monotonically_increasing_id == df2.temp_name_monotonically_increasing_id)).drop(df2.temp_name_monotonically_increasing_id)
return df_mode.drop("temp_name_monotonically_increasing_id")
from pysprak.sql import functions as F
count_mode_val = df.groupBy("column_name").count().filter(F.col("column_name").isNotNull()).agg(F.max("count")).collect()[0][0]
mode_val = df.groupBy("column_name").count().filter(F.col("column_name").isNotNull()).filter(F.col("count") == count_mode_val).select("column_name").collect()[0][0]
7条答案
按热度按时间rt4zxlrg1#
众数的问题与中位数的问题几乎相同。虽然它很容易计算,但计算是相当昂贵的。它可以使用排序,然后使用本地和全局聚合,或者使用just-another-wordcount和filter来完成:
无论哪种方式,都可能需要对每列进行完全 Shuffle 。
jw5wzhpr2#
这一行将给予spark Dataframe df中“col”的模式:
对于df中所有列的模式列表,请使用:
要添加名称以标识哪列的模式,请创建2D列表:
7fyelxc53#
下面的方法可以帮助您获取输入 Dataframe 的所有列的模式
a64a0gku4#
您可以使用Java代码计算列模式,如下所示:
x6yk4ghg5#
使用groupBy()函数获取列中每个类别的计数。df是我的结果 Dataframe ,有两列var210,count。使用orderBy(),列名为'count',按降序给予数据框第一行的最大值。collect()[0][0]用于获取 Dataframe 中的1元组
zd287kbt6#
首先按列按count分组(我没有计算空值),并获得最大的count值(频繁值)。第二,查找最大计数值的键:
zbwhf8kr7#
使用UDF,因为它简单且不太复杂:-
它将适用于Categorical和Numeric数据类型。
注意:-请处理数据中的None/Null值,否则有可能获得意外输出。