2017-08-25 4 views
0

Je suis bien au courant de trame de données Pandas où j'utilise « mode » fonction et « groupby » pour obtenir des valeurs les plus fréquentes, comme ci-dessouscomment obtenir les valeurs les plus fréquentes d'une trame de données dans PySpark

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

mais je Je suis confronté à quelques difficultés pour entrer dans PySpark.

J'ai une trame de données d'allumage comme suit:

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

Ce que je veux est la suivante:

band  A3 A5 status 
4G_band1800 12 18 TRUE 
4g_band2300 6 24 FALSE 

Screenshot of above

J'ai essayé toutes les combinaisons possibles mais n'ont pas de sortie raisonnable. S'il vous plaît suggérer un moyen.

+0

pouvez-vous partager vos données d'entrée dans un format que les autres peuvent comprendre? – mtoto

+0

salut, j'ai mis à jour la question en utilisant des images .. l'image est une entrée de trame de données et image 2 ce que je veux dans la sortie –

+0

pas d'images s'il vous plaît – mtoto

Répondre

5

Sans définir votre propre UDAF, vous pouvez définir une fonction de mode (FDU) et l'utiliser avec collect_list comme suit:

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