【问题标题】:Token frequency of tokens in a list inside DataFrame [closed]DataFrame内列表中令牌的令牌频率[关闭]
【发布时间】:2018-12-08 15:38:36
【问题描述】:

我不太清楚如何表达这个标题。 我有一个包含一列的数据框,其中每一行都包含一个令牌列表。我需要获取单词的频率,然后对它们进行排序以获得最频繁的单词。这是 DataFrame 架构的图像:https://i.stack.imgur.com/elkZz.png

使用标记器来获取标记数组。

What the array inside the Dataframe row looks like

现在我已经这样做了,当时“行”仅由一个包含大量单词的字符串组成,而不是在每个索引处包含单词的列表。

与:

frequency = dataframe.flatMap(lambda line: line.split(" ")).map(lambda word: (word, 1)).reduceByKey(lambda a, b: a+b)

但是,我终其一生都无法弄清楚如何访问这些元素。上面的 lambda 表达式不起作用,因为它试图在列表中执行它。 '不可散列的类型:'list''

所以 tldr 中的问题:如何正确访问数组中的元素以计算数据框所有行中单词的频率?此外,我将如何将结果放入数组中?

【问题讨论】:

    标签: python apache-spark dataframe pyspark


    【解决方案1】:

    一种方法是在pyspark.sql.functions 模块中使用explode。它接受一个数组列,并为您应用explode 函数的整个列的数组中的每个元素返回一个新行。由于您的 DataFrame 只有一列,因此要获取整个 DataFrame 中的字数,它看起来像这样:

    dataframe \
        .select(explode("words").alias("words_exploded")) \
        .groupBy("words_exploded") \
        .count()
    

    如果您想获取每条记录的字数,可以在“爆炸”列表之前添加一个 ID 列,例如通过使用monotonically_increasing_id:

    dataframe \
        .withColumn(monotonically_increasing_id().alias('id')) \
        .select(explode("words").alias("words_exploded")) \
        .groupBy("id", "words_exploded").count()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-14
      • 2013-06-13
      • 1970-01-01
      • 2021-01-16
      • 1970-01-01
      • 2014-12-03
      • 2013-10-05
      相关资源
      最近更新 更多