我的列中填充了用户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|
+----+-------+
这个想法是用户在数据框中出现的次数将是分类器的有用输入。
答案 0 :(得分:1)
最简单的方法是使用pyspark.sql.Window
和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|
#+----+-------+
我们将窗口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|
+----+-----+