Горячее кодирование в pyspark с несколькими 1 в ряд - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть Python dataframe final_df следующим образом:

enter image description here

Строки имеют повторяющиеся значения ID. Как я могу получить вывод в горячем виде следующим образом, используя pyspark?

enter image description here

Я преобразовал его в кадр данных искры:

spark_df = sqlContext.createDataFrame(final_df)

А затем собрал уникальные значения в столбце CONCEPTS следующим образом:

types = spark_df.select("CONCEPTS").distinct().rdd.flatMap(lambda x: x).collect()

Но когда я звоню следующее:

types_expr = [F.when((F.col("CONCEPTS") == ty), 1).otherwise(0).alias(ty) for ty in types]
df = spark_df.select("ID", *types_expr)
df.show()

Я получаю следующее:

enter image description here

Решения других вопросов, подобных этому, не приводят к множеству 1 для ряда.

1 Ответ

0 голосов
/ 02 ноября 2018

Вы можете использовать функцию pivot класса GroupedData, так как вы работаете только с 1 и 0. Пример кода:

l =[( 115        ,'A' ),
( 116        , 'B' ),
( 118        , 'C' ),
( 121        , 'D' ),
( 125        , 'E' ),
( 127        , 'F' ),
( 127        , 'G' ),
( 127        , 'H' ),
( 136        , 'I' ),
( 136        , 'J' )]

df = spark.createDataFrame(l, ['id','concepts'])
df.groupBy('id').pivot('concepts').count().show()

приведет к следующему кадру данных:

+---+----+----+----+----+----+----+----+----+----+----+   
| id|   A|   B|   C|   D|   E|   F|   G|   H|   I|   J| 
+---+----+----+----+----+----+----+----+----+----+----+ 
|136|null|null|null|null|null|null|null|null|   1|   1| 
|116|null|   1|null|null|null|null|null|null|null|null| 
|115|   1|null|null|null|null|null|null|null|null|null| 
|127|null|null|null|null|null|   1|   1|   1|null|null| 
|118|null|null|   1|null|null|null|null|null|null|null| 
|125|null|null|null|null|   1|null|null|null|null|null| 
|121|null|null|null|   1|null|null|null|null|null|null| 
+---+----+----+----+----+----+----+----+----+----+----+

При необходимости замените нулевые значения функцией fill

...