Проверьте наличие частичной строки в значениях столбцов, разделенных запятыми, между двумя фреймами данных, используя python - PullRequest
1 голос
/ 23 мая 2019

У меня есть 2 кадра данных.

В одном кадре данных DF1 есть столбец со значениями, разделенными запятой, например, через запятую.Второй кадр данных DF2 имеет столбец с одним значением (это может быть частью значений столбца, разделенных запятыми, в другом кадре данных, DF1).Мне нужно перебрать записи / строки DF2 и посмотреть, существует ли DF2.color в значениях столбцов, разделенных запятыми в DF1.csv_column, и, если существует, добавить идентификатор строки df1 В НОВУЮ ФУНКЦИЮ ДАННЫХ.

df1= sqlContext.createDataFrame([("A001","RED, WHITE, BLUE"),("A002","RED, YELLOW"),("A003","GREEN,RED"),("A004","WHITE,YELLOW")], ["id","csv_column"])
df1.show()


df2= sqlContext.createDataFrame([("C1","RED"),("C2","WHITE"),("C3","BLUE"),("C4","YELLOW"),("C5","RED"),("C6","GREEN"),("C7","BLUE")], ["CLRCODE","COLOR"])
df2.show()

+----+----------------+ 
| id | csv_column     | 
+----+----------------+ 
|A001|RED, WHITE, BLUE| 
|A002|RED, YELLOW     | 
|A003|GREEN, RED      | 
|A004|WHITE, YELLOW   |
 +----+----------------+

+-------+-------+ 
|CLRCODE| COLOR | 
+-------+-------+ 
| C1    | RED   | 
| C2    | WHITE | 
| C3    | BLUE  | 
| C4    | YELLOW| 
| C5    | RED   | 
| C6    | GREEN | 
| C7    | BLUE  | 
+-------+-------+

Ожидаемый результат: Столбец csv_column в df1 имеет RED, WHITE, BLUE и поэтому я добавил идентификаторы для RED, WHITE, BLUE в качестве строки в новый фрейм данных,и так далее.Обратите внимание, что CLRCODE в DF2 является просто заполнителем и поэтому не используется.Как получить этот результат.

+-------+
|df1.id |
+-------+
|A001   |
|A002   |
|A003   |
|A001   |
|A004   |
|A001   |
|A002   |
|A004   |
|A001   |
|A002   |
|A003   |
|A003   |
|A001   |
+-------+

Я проверил в этом решении SO здесь , но там столбец с разделенными запятыми датафреймами проверяется на соответствие статическому строковому значению, но мне нужно пройти черезфрейм данных, который содержит много строк различных значений.

Спасибо за помощь.

1 Ответ

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

Вы можете сначала split и explode столбец df1.csv_column, а после join на df2 вы можете groupBy и concat_ws.например, вы можете сделать:

import pyspark.sql.functions as F
df_res = (df2.join( df1.withColumn('color', F.explode(F.split('csv_column',',\s*'))),
                    on='color', how='left')
              .groupby("CLRCODE").agg(F.concat_ws(", ", F.collect_list(F.col('id'))).alias('id'))
              .orderBy('CLRCODE').drop('CLRCODE'))
df_res.show()
+----------------+
|              id|
+----------------+
|A001, A002, A003|
|      A001, A004|
|            A001|
|      A002, A004|
|A001, A002, A003|
|            A003|
|            A001|
+----------------+

EDIT : для отредактированного ожидаемого вывода вам понадобятся части split, explode и join.Затем orderBy и select столбец, который вы хотите:

import pyspark.sql.functions as F
df_res = (df2.join( df1.withColumn('color', F.explode(F.split('csv_column',',\s*'))),
                    on='color', how='left').orderBy(*['CLRCODE', 'id']).select('id'))
df_res.show()
+----+
|  id|
+----+
|A001|
|A002|
|A003|
|A001|
|A004|
|A001|
|A002|
|A004|
|A001|
|A002|
|A003|
|A003|
|A001|
+----+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...