使用火花将每行中的值转换为新列
Posted
技术标签:
【中文标题】使用火花将每行中的值转换为新列【英文标题】:Converting values in each row into new column with spark 【发布时间】:2019-04-09 02:23:04 【问题描述】:我正在使用 Python 中的 Spark 从 XML 文件创建数据框。 我想要做的是将每一行中的值转换为新列并制作虚拟变量。
这是一个例子。
输入:
id | classes |
-----+--------------------------+
132 | economics,engineering |
201 | engineering |
123 | sociology,philosophy |
222 | philosophy |
--------------------------------
输出:
id | economics | engineering | sociology | philosophy
-----+-----------+-------------+-----------+-----------
132 | 1 | 1 | 0 | 0
201 | 0 | 1 | 0 | 0
123 | 0 | 0 | 1 | 1
222 | 0 | 0 | 0 | 1
--------------------------------------------------------
【问题讨论】:
How to pivot DataFrame?的可能重复 【参考方案1】:将列分解为多行 参考:Explode in PySpark
import pyspark.sql.functions as F
df = spark.createDataFrame([(132, "economics,engineering"),(201, "engineering"),(123, "sociology,philosophy"),(222, "philosophy")], ["id", "classes"])
+---+--------------------+
| id| classes|
+---+--------------------+
|132|economics,enginee...|
|201| engineering|
|123|sociology,philosophy|
|222| philosophy|
+---+--------------------+
explodeCol = df.select(col("id"), F.explode(F.split(col("classes"), ",")).alias("branch"))
+---+-----------+
| id| branch|
+---+-----------+
|132| economics|
|132|engineering|
|201|engineering|
|123| sociology|
|123| philosophy|
|222| philosophy|
+---+-----------+
explodeCol.groupBy("id").pivot("branch").agg(F.sum(lit(1))).na.fill(0).show()
+---+---------+-----------+----------+---------+
| id|economics|engineering|philosophy|sociology|
+---+---------+-----------+----------+---------+
|222| 0| 0| 1| 0|
|201| 0| 1| 0| 0|
|132| 1| 1| 0| 0|
|123| 0| 0| 1| 1|
+---+---------+-----------+----------+---------+
更详细的 Spark 文档参考http://spark.apache.org/docs/2.4.0/api/python/pyspark.sql.html
【讨论】:
以上是关于使用火花将每行中的值转换为新列的主要内容,如果未能解决你的问题,请参考以下文章
根据每个句子的第一个单词将 pandas 数据框列中的字符串列表分解为新列