在数据框的新列中需要词频 // scala

Posted

技术标签:

【中文标题】在数据框的新列中需要词频 // scala【英文标题】:need term frequency in new column of dataframe // scala 【发布时间】:2016-09-13 04:39:02 【问题描述】:

我有这个数据框:

+----------+--------+---------+-------------+----+
|article_id|     sen|    token|          ner| pos|
+----------+--------+---------+-------------+----+
|         1|example1|Standford| Organisation| NNP|
|         1|example1|       is|            O|  VP|
|         1|example1|       is|     LOCATION| ADP|
|         2|example2|Standford|Organisation2|NNP2|
|         2|example2|       is|           O2| VP2|
|         2|example2|     good|    LOCATION2|ADP2|
+----------+--------+---------+-------------+----+

我需要一个名为“term_frequency”的新列,它给了我:

2前面的

斯坦福

前面的 1

因为我需要用它们在 article_id 中出现的次数来映射它们。

我猜是这样的:

df2.withColumn("termFrequency",'token.map(s => (s,1).reduceByKey(_ + _))) 或创建新的 UDF。

数据框架构如下:

root
 |-- article_id: long (nullable = true)
 |-- sen: string (nullable = true)
 |-- token: string (nullable = true)
 |-- ner: string (nullable = true)
 |-- pos: string (nullable = true)

【问题讨论】:

【参考方案1】:

你可以通过两列上的双重分组得到结果:

>>> from pyspark.sql import Row
>>> lines = sc.textFile("data.txt")
>>> parts = lines.map(lambda l: l.split(","))
>>> articles = parts.map(lambda p: Row(article_id=int(p[0]), sen=p[1], token=p[2], ner=p[3], pos=p[4]))
>>> df = articles.toDF()

>>> df.count()
6

>>> df.groupBy("article_id", "token").count().show()
+----------+---------+-----+
|article_id|    token|count|
+----------+---------+-----+
|         1|Standford|    1|
|         1|       is|    2|
|         2|Standford|    1|
|         2|       is|    1|
|         2|     good|    1|
+----------+---------+-----+

您可以将这个新表注册为一个表,将原来的一个表注册为一个表,并执行连接再次得到一个表:

>>> sqlContext.registerDataFrameAsTable(df, "terms")
>>> sqlContext.registerDataFrameAsTable(freq, "freq")
>>> sqlContext.sql("SELECT * FROM terms JOIN freq ON terms.article_id = freq.article_id AND terms,token = freq.token").show()
+----------+-------------+----+--------+---------+----------+---------+-----+
|article_id|          ner| pos|     sen|    token|article_id|    token|count|
+----------+-------------+----+--------+---------+----------+---------+-----+
|         1| Organisation| NNP|example1|Standford|         1|Standford|    1|
|         1|            O|  VP|example1|       is|         1|       is|    2|
|         1|     LOCATION| ADP|example1|       is|         1|       is|    2|
|         2|Organisation2|NNP2|example2|Standford|         2|Standford|    1|
|         2|           O2| VP2|example2|       is|         2|       is|    1|
|         2|    LOCATION2|ADP2|example2|     good|         2|     good|    1|
+----------+-------------+----+--------+---------+----------+---------+-----+

希望这会有所帮助!

【讨论】:

以上是关于在数据框的新列中需要词频 // scala的主要内容,如果未能解决你的问题,请参考以下文章

如何有条件地将子字符串复制到熊猫数据框的新列中?

将来自一个数据框的值合并到 Pandas 中的新列中[重复]

在附属机构中查找城市名称,并将它们与其对应的国家/地区添加到数据框的新列中

spark scala - UDF 用于创建新列

如何在 r 的新列中拆分逗号

Scala DataFrame,将非空列的值复制到新列中