如何创建一个计算数据框列中 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.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 列进行分区(分组依据)。然后我们计算这个窗口的计数。

【讨论】:

【参考方案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 条件?

如何访问 pandas 数据框列中的字典元素并对其进行迭代以创建填充有各自值的新列?

通过引用字符串位置检查数据框列中的子字符串

在熊猫数据框列中查找特定文本

R数据存储在一个数据框列的两个列表中,想要创建单独的列