2017-08-25 106 views
0

一個數據幀的最頻繁的價值觀我很熟悉,我使用的功能「模式」和「GROUPBY」來獲得最頻繁的值,比如熊貓數據幀以下如何讓PySpark

df3=df5.groupby(['band']).apply(lambda x: x.mode()) 

但是我我在PySpark遇到一些困難。

我有一個火花的數據幀如下:

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

我已經嘗試了所有可能的組合但沒有得到任何合理的產出。 請建議一種方式。

+0

可你,其他人可以理解的格式共享您的輸入數據? – mtoto

+0

嗨,我更新了使用圖像的問題..圖像一個是輸入的數據幀和圖像2我想輸出 –

+0

沒有圖像請 – mtoto

回答

5

沒有定義自己的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| 
+-----------+---+---+------+