【问题标题】:How to create a column that calculates frequency of an ID in dataframe column?如何创建一个计算数据框列中 ID 频率的列?
【发布时间】: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|
+----+-------+

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

【问题讨论】:

  • 你有什么问题?

标签: python dataframe pyspark


【解决方案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|
      +----+-----+
      

      【讨论】:

      • 这与我想要做的很接近,除了我想保持相同的行数。计数将用作输入特征。
      • 我已根据您的输入内容编辑了原始问题。
      猜你喜欢
      • 1970-01-01
      • 2021-12-27
      • 2014-04-18
      • 2020-12-29
      • 2022-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多