如何创建一个计算数据框列中 ID 频率的列?
Posted
技术标签:
【中文标题】如何创建一个计算数据框列中 ID 频率的列?【英文标题】:How to create a column that calculates frequency of an ID in dataframe column? 【发布时间】:2018-04-15 09:47:59 【问题描述】:我有一列以字符串形式填充了用户 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|
+----+-------+
这个想法是用户在数据框中出现的次数将成为分类器的有用输入。
【问题讨论】:
你有什么问题? 【参考方案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
列进行分区(分组依据)。然后我们计算这个窗口的计数。
【讨论】:
【参考方案2】:你可以这样做:
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|
+----+-----+
【讨论】:
【参考方案3】:你可以使用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|
+----+-----+
【讨论】:
这与我想要做的很接近,除了我想保持相同的行数。计数将用作输入特征。 我已根据您的输入内容编辑了原始问题。以上是关于如何创建一个计算数据框列中 ID 频率的列?的主要内容,如果未能解决你的问题,请参考以下文章
如何检查同一数据框列中的重复值并通过根据频率删除行来应用 if 条件?