如何在 PySpark 中获取数据框的最频繁值
how to get most frequent values of a dataframe in PySpark
我非常熟悉 Pandas 数据框,我在其中使用函数 "mode" 和 "groupby" 来获取最频繁的值,如下所示
df3=df5.groupby(['band']).apply(lambda x: x.mode())
但是我在进入 PySpark 时遇到了一些困难。
我有一个spark数据框如下:
band A3 A5 status
4G_band1800 12 18 TRUE
4G_band1800 12 18 FALSE
4G_band1800 10 18 TRUE
4G_band1800 12 12 TRUE
4g_band2300 6 24 FALSE
4g_band2300 6 22 FALSE
4g_band2300 6 24 FALSE
4g_band2300 3 24 TRUE
Screenshot of above
我想要的是:
band A3 A5 status
4G_band1800 12 18 TRUE
4g_band2300 6 24 FALSE
Screenshot of above
我已经尝试了所有可能的组合,但没有得到任何合理的输出。
请提出一个方法。
在不定义自己的 UDAF
的情况下,您可以定义模式函数 (udf) 并将其与 collect_list
一起使用,如下所示:
import pyspark.sql.functions as F
@F.udf
def mode(x):
from collections import Counter
return Counter(x).most_common(1)[0][0]
cols = ['A3', 'A5', 'status']
agg_expr = [mode(F.collect_list(col)).alias(col) for col in cols]
df.groupBy('band').agg(*agg_expr).show()
+-----------+---+---+------+
| band| A3| A5|status|
+-----------+---+---+------+
|4G_band1800| 12| 18| true|
|4g_band2300| 6| 24| false|
+-----------+---+---+------+
我非常熟悉 Pandas 数据框,我在其中使用函数 "mode" 和 "groupby" 来获取最频繁的值,如下所示
df3=df5.groupby(['band']).apply(lambda x: x.mode())
但是我在进入 PySpark 时遇到了一些困难。
我有一个spark数据框如下:
band A3 A5 status
4G_band1800 12 18 TRUE
4G_band1800 12 18 FALSE
4G_band1800 10 18 TRUE
4G_band1800 12 12 TRUE
4g_band2300 6 24 FALSE
4g_band2300 6 22 FALSE
4g_band2300 6 24 FALSE
4g_band2300 3 24 TRUE
Screenshot of above
我想要的是:
band A3 A5 status
4G_band1800 12 18 TRUE
4g_band2300 6 24 FALSE
Screenshot of above
我已经尝试了所有可能的组合,但没有得到任何合理的输出。 请提出一个方法。
在不定义自己的 UDAF
的情况下,您可以定义模式函数 (udf) 并将其与 collect_list
一起使用,如下所示:
import pyspark.sql.functions as F
@F.udf
def mode(x):
from collections import Counter
return Counter(x).most_common(1)[0][0]
cols = ['A3', 'A5', 'status']
agg_expr = [mode(F.collect_list(col)).alias(col) for col in cols]
df.groupBy('band').agg(*agg_expr).show()
+-----------+---+---+------+
| band| A3| A5|status|
+-----------+---+---+------+
|4G_band1800| 12| 18| true|
|4g_band2300| 6| 24| false|
+-----------+---+---+------+