Разделите совокупное значение, используя значения из фрейма данных в PySpark - PullRequest
0 голосов
/ 05 июня 2018

У меня есть фрейм данных, как показано ниже в pyspark.

+---+-------------+----+
| id|       device| val|
+---+-------------+----+
|  3|      mac pro|   1|
|  1|       iphone|   2|
|  1|android phone|   2|
|  1|   windows pc|   2|
|  1|   spy camera|   2|
|  2|   spy camera|   3|
|  2|       iphone|   3|
|  3|   spy camera|   1|
|  3|         cctv|   1|
+---+-------------+----+

Я хочу заполнить некоторые столбцы на основе следующих значений: lists

phone_list = ['iphone', 'android phone', 'nokia']
pc_list = ['windows pc', 'mac pro']
security_list = ['spy camera', 'cctv']

Я сделал какниже.

import pyspark.sql.functions as F

df.withColumn('cat', 
    F.when(df.device.isin(phone_list), 'phones').otherwise(
    F.when(df.device.isin(pc_list), 'pc').otherwise(
    F.when(df.device.isin(security_list), 'security')))
).groupBy('id').pivot('cat').agg(F.count('cat')).show()

Я получил желаемый результат.

Теперь я хочу внести некоторые изменения в код и заполнить значение столбца после того, как разделю столбец cat назначение в data frame для этого id.

Я пробовал что-то вроде ниже, но не получил правильный результат

df.withColumn('cat', 
    F.when(df.device.isin(phone_list), 'phones').otherwise(
    F.when(df.device.isin(pc_list), 'pc').otherwise(
    F.when(df.device.isin(security_list), 'security')))
).groupBy('id').pivot('cat').agg(F.count('cat')/ df.val).show()

Как я могу получить то, что я хочу?

редактировать

Expected result

+---+----+------+--------+
| id|  pc|phones|security|
+---+----+------+--------+
|  1| 0.5|     1|     0.5|
|  3|   1|  null|       2|
|  2|null|  0.33|    0.33|
+---+----+------+--------+

1 Ответ

0 голосов
/ 05 июня 2018

Для агрегации потребуется функция агрегирования, простой столбец не будет идентифицирован

Поскольку столбец val содержит одинаковое значение для каждой группы столбца id, вы можете использовать first встроенная функция как

df.withColumn('cat',
              F.when(df.device.isin(phone_list), 'phones').otherwise(
                  F.when(df.device.isin(pc_list), 'pc').otherwise(
                      F.when(df.device.isin(security_list), 'security')))
              ).groupBy('id').pivot('cat').agg(F.count('cat')/ F.first(df.val)).show()

, которая должна дать вам

+---+----+------------------+------------------+
| id|  pc|            phones|          security|
+---+----+------------------+------------------+
|  3| 1.0|              null|               2.0|
|  1| 0.5|               1.0|               0.5|
|  2|null|0.3333333333333333|0.3333333333333333|
+---+----+------------------+------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...