Как заменить нули на значения из другой строки идентификатором в фрейме данных pyspark? - PullRequest
0 голосов
/ 07 мая 2019

У меня есть этот фрейм данных.

+------+-----------+---------------+--------+---------+------------------+----+------------------+------+-----+-----------+
|prodid|       snbr|              A|       B|        C|                 D|   E|                 F|     G|    H|          I|
+------+-----------+---------------+--------+---------+------------------+----+------------------+------+-----+-----------+
| 10510|          0|           null|    null|      750|              null|null|              null| 48.72| 3.15|Napa Valley|
| 10510|          1|     California|       1|     null|Cabernet Sauvignon| Red|Cabernet Sauvignon|  null| null|       null|
| 26619|          0|      Australia|       1|      750|Cabernet Sauvignon| Red|Cabernet Sauvignon| 2.695| 2.95|       null|
| 26619|          1|           null|    null|     null|            Shiraz|null|    Syrah / Shiraz|  null| null|       null|
+------+-----------+---------------+--------+---------+------------------+----+------------------+------+-----+-----------+

Я хочу этот фрейм данных

+------+-----------+---------------+--------+---------+------------------+----+------------------+------+-----+-----------+
|prodid|       snbr|              A|       B|        C|                 D|   E|                 F|     G|    H|          I|
+------+-----------+---------------+--------+---------+------------------+----+------------------+------+-----+-----------+
| 10510|          0|     California|       1|      750|Cabernet Sauvignon| Red|Cabernet Sauvignon| 48.72| 3.15|Napa Valley|
| 10510|          1|     California|       1|      750|Cabernet Sauvignon| Red|Cabernet Sauvignon| 48.72| 3.15|Napa Valley|
| 26619|          0|      Australia|       1|      750|Cabernet Sauvignon| Red|Cabernet Sauvignon| 2.695| 2.95|       null|
| 26619|          1|      Australia|       1|      750|            Shiraz| Red|    Syrah / Shiraz| 2.695| 2.95|       null|
+------+-----------+---------------+--------+---------+------------------+----+------------------+------+-----+-----------+

Я хочу скопировать ноль пустые строки из одной строки в другую динамическим способом. Без использования конкретных имен столбцов. Использование prodid и snbr нормально.

TBH Я потерян. Я думаю, что, возможно, переосмыслил, как я сюда попал. Извините, у меня нет кода.

1 Ответ

0 голосов
/ 07 мая 2019

Вот решение, я взял только три столбца A, B, F для покрытия различий, но это сработает при отсутствии столбцов и строк.По сути, поиск максимума дает ненулевое значение в каждой группе «prodid», а объединение с «prodid» и «snbr» дает желаемый результат.

Но это не работает, если в группе дляcol больше одного определенного значения, а также нулевое значение.Вы можете настроить это решение в соответствии с вашим требованием.

import pyspark.sql.functions as F

df = spark.createDataFrame(
    [(10510, 0, 'California', None,None),(10510, 1, None,1,'Cabernet Sauvignon'),(10510, 2, None,None,None),
     (26619, 1, None,1,'Cabernet Sauvignon'),(26619, 2, 'Australia',None,'Cabernet Sauvignon'),(26619, 3, 'Australia',1,'Syrah / Shiraz')
    ], ["prodid", "snbr", "A","B","F"])

df_not_nulls = df.groupBy(
    F.col("prodid")
).agg(  *(F.max(c).alias(c)
      for c in df.columns if c!= 'prodid')
)

df.join(df_not_nulls,"prodid").select(*[F.coalesce(df[c],df_not_nulls[c]).alias(c) for c in df.columns]).show()

, в результате чего

+------+----+----------+---+------------------+
|prodid|snbr|         A|  B|                 F|
+------+----+----------+---+------------------+
| 10510|   0|California|  1|Cabernet Sauvignon|
| 10510|   1|California|  1|Cabernet Sauvignon|
| 10510|   2|California|  1|Cabernet Sauvignon|
| 26619|   1| Australia|  1|Cabernet Sauvignon|
| 26619|   2| Australia|  1|Cabernet Sauvignon|
| 26619|   3| Australia|  1|    Syrah / Shiraz|
+------+----+----------+---+------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...