首页 > 解决方案 > PySpark 数据框转换

问题描述

我有以下数据框:

import pandas as pd
from pyspark import SparkContext
from pyspark.sql import SQLContext

sc = SparkContext('local')

df_pd = pd.DataFrame([[11, 'abc', 1, 114],
                      [11, 'abc', 2, 104],
                      [11, 'def', 9, 113],
                      [12, 'abc', 1,  14],
                      [12, 'def', 3, 110],
                      [14, 'abc', 1, 194],
                      [14, 'abc', 2, 164],
                      [14, 'abc', 3, 104],],
                      columns=['id', 'str', 'num', 'val'])

sql_sc = SQLContext(sc)

df_spark = sql_sc.createDataFrame(df_pd)
df_spark.show()

哪个打印:

+---+---+---+---+
| id|str|num|val|
+---+---+---+---+
| 11|abc|  1|114|
| 11|abc|  2|104|
| 11|def|  9|113|
| 12|abc|  1| 14|
| 12|def|  3|110|
| 14|abc|  1|194|
| 14|abc|  2|164|
| 14|abc|  3|104|
+---+---+---+---+

我的目标是将其转换为:

+---+-----+-----+-----+-----+-----+
| id|abc_1|abc_2|abc_3|def_3|def_9|
+---+-----+-----+-----+-----+-----+
| 11|  114|  104|  NaN|  NaN|  113|
| 12|   14|  NaN|  NaN|  110|  NaN|
| 14|  194|  164|  104|  NaN|  NaN|
+---+-----+-----+-----+-----+-----+

(每行id,列名称为str+'_'+str(val),结果表中填充了相应val的 s,所有其他条目为NaN

我将如何实现这一目标?我从

column = df_spark.select(concat(col("str"), lit("_"), col("num")))

通过它我得到列名。

df_spark.select('id').distinct()

给出不同id的 s

但我无法构建新的 Dataframe 或填充它。

编辑:与可能重复的不同之处在于我不知道枢轴功能,而另一个问题询问在 pyspark 中哪里可以找到函数“枢轴”。我不知道那是否是重复的,但我没有找到另一个问题,因为我不知道要寻找什么。

标签: pysparkapache-spark-sqlpyspark-sql

解决方案


我不确定您要对 val 字段使用哪种聚合。我使用了 sum,这是解决方案

import pyspark.sql.functions as F

df_spark = df_spark.withColumn('col', F.concat(F.col("str"), F.lit("_"), F.col("num")))

df_spark.groupBy('id').pivot('col').agg({'val':'sum'}).orderBy('id').show()

+---+-----+-----+-----+-----+-----+
| id|abc_1|abc_2|abc_3|def_3|def_9|
+---+-----+-----+-----+-----+-----+
| 11|  114|  104| null| null|  113|
| 12|   14| null| null|  110| null|
| 14|  194|  164|  104| null| null|
+---+-----+-----+-----+-----+-----+

推荐阅读