У меня есть фрейм данных, как показано ниже в 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']
ucg_list = ['ipad']
Я сделал, как показано ниже.
from pyspark.sql.functions import col, when, lit
from pyspark.sql.types import IntegerType
df1 = df.withColumn('phones', lit(None).cast(IntegerType())).withColumn('pc', lit(None).cast(IntegerType())).withColumn('security', lit(None).cast(IntegerType())).withColumn('null', lit(None).cast(IntegerType())).withColumn('ucg', lit(None).cast(IntegerType()))
import pyspark.sql.functions as F
df1.withColumn('cat',
F.when(df1.device.isin(phone_list), 'phones').otherwise(
F.when(df1.device.isin(pc_list), 'pc').otherwise(
F.when(df1.device.isin(security_list), 'security')))
).groupBy('id', 'phones', 'pc', 'security', 'null', 'ucg').pivot('cat').agg(F.count('cat')).show()
вывод Я получаю
+---+------+----+--------+----+----+----+---+------+--------+
| id|phones| pc|security|null| ucg|null| pc|phones|security|
+---+------+----+--------+----+----+----+---+------+--------+
| 3| null|null| null|null|null| 0| 1| 0| 1|
| 2| null|null| null|null|null| 0| 0| 1| 1|
| 1| null|null| null|null|null| 0| 1| 2| 1|
+---+------+----+--------+----+----+----+---+------+--------+
Мне нужно сначала создать столбцы на основе имен списка, а затем заполнить значения
ожидаемый результат
+---+------+---+------+--------+----+
| id| ucg| pc|phones|security|null|
+---+------+---+------+--------+----+
| 1| 0| 1| 2| 1| 0|
| 2| 0| 0| 1| 1| 0|
| 3| 0| 1| 0| 1| 1|
+---+------+---+------+--------+----+
Как я могу получить то, что хочу?
Редактировать
, когда я делаю ниже
df1 = 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(ucg_list), 'ucg').otherwise(
f.when(df.device.isin(security_list), 'security')))))
Вывод
+---+-------------+---+--------+
| id| device|val| cat|
+---+-------------+---+--------+
| 3| mac pro| 1| pc|
| 3| spy camera| 1|security|
| 3| cctv| 1| null|
| 1| iphone| 2| phones|
| 1|android phone| 2| phones|
| 1| windows pc| 2| pc|
| 1| spy camera| 2|security|
| 2| spy camera| 3|security|
| 2| iphone| 3| phones|
+---+-------------+---+--------+
В выводе вы можете видеть, что id
3
имеет значение null
в cat
столбце