在数据框的新列中需要词频 // 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 中的新列中[重复]