J'ai une colonne remplie d'ID utilisateur sous forme de chaînes. J'essaie de créer une nouvelle colonne qui compte combien d'autres exemples ont le même ID utilisateur.

Par exemple, un nombre de 10 pour userId 1 indique qu'il y a 10 autres occurrences de cet utilisateur ailleurs dans la colonne UserId.

Le nombre de lignes de la nouvelle colonne doit être égal au nombre de lignes de la trame de données.

>>> df = sc.parallelize([('6',10),('9',44),('6',30),('12',100),('9',99)]).toDF(['user','somecol'])
>>> df.show()
+----+-------+
|user|somecol|
+----+-------+
|   6|     10|
|   9|     44|
|   6|     30|
|  12|    100|
|   9|     99|
+----+-------+

Ressemblerait à ceci:

+----+-------+
|user| count |
+----+-------+
|   6|      2|
|   9|      2|
|   6|      2|
|  12|      1|
|   9|      2|
+----+-------+

L'idée est que le nombre de fois qu'un utilisateur se produit dans la trame de données sera une entrée utile pour un classificateur.

-2
Thomas Bloomfield 15 avril 2018 à 12:47

3 réponses

Meilleure réponse

Tu peux faire:

from pyspark.sql import functions as F

# aggregate data
new_df = df.groupby('user').agg(F.count("somecol").alias("count"))

# add back to df
df = df.join(new_df, 'user').select('user','count')
df.show()

+----+-----+
|user|count|
+----+-----+
|   6|    2|
|   6|    2|
|   9|    2|
|   9|    2|
|  12|    1|
+----+-----+
0
YOLO 15 avril 2018 à 18:16

Vous pouvez utiliser groupBy

>>> df = sc.parallelize([('6',10),('9',44),('6',30),('12',100),('9',99)]).toDF(['user','somecol'])
>>> df.show()
+----+-------+
|user|somecol|
+----+-------+
|   6|     10|
|   9|     44|
|   6|     30|
|  12|    100|
|   9|     99|
+----+-------+

>>> df.groupBy('user').agg(count(col('somecol')).alias('total')).show()
+----+-----+                                                                    
|user|total|
+----+-----+
|   6|    2|
|   9|    2|
|  12|    1|
+----+-----+
0
Bala 15 avril 2018 à 12:23

Le plus simple est d'utiliser un pyspark.sql.Window et select:

import pyspark.sql.functions as f
from pyspark.sql import Window

w = Window.partitionBy('user')

df = df.select('user', f.count('somecol').over(w).alias('count'))
df.show()
#+-----+-------+
#|user| count |
#+----+-------+
#|   6|      2|
#|   9|      2|
#|   6|      2|
#|  12|      1|
#|   9|      2|
#+----+-------+

Nous définissons la fenêtre w à partitionner par (grouper par) la colonne user. Ensuite, nous calculons le nombre sur cette fenêtre.

1
pault 15 avril 2018 à 20:30