如何创建一个计算dataframe列中ID的频率的列?

时间:2018-04-15 09:47:59

标签: python dataframe pyspark

我的列中填充了用户ID作为字符串。我正在尝试创建一个新列,计算有多少其他示例具有相同的用户ID。

例如,userId 1的计数为10表示此用户在UserId列的其他位置有10次出现。

新列中的行数应等于数据框中的行数。

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

看起来像这样:

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

这个想法是用户在数据框中出现的次数将是分类器的有用输入。

3 个答案:

答案 0 :(得分:1)

最简单的方法是使用pyspark.sql.Windowselect

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

我们将窗口w定义为user列的分组(分组)。然后我们计算这个窗口的计数。

答案 1 :(得分:0)

您可以使用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|
+----+-----+

答案 2 :(得分:0)

你可以这样做:

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