создать новые столбцы из столбца строки - PullRequest
0 голосов
/ 08 мая 2018

У меня есть как DataFrame со строковым столбцом

val df= Seq(("0003C32C-FC1D-482F-B543-3CBD7F0A0E36 0,8,1,799,300:3  0,6,1,330,300:1  2,6,1,15861:1 0,7,1,734,300:1 0,6,0,95,300:1 2,7,1,15861:1 0,8,0,134,300:3")).toDF("col_str")

+--------------------+
|             col_str|
+--------------------+
|0003C32C-FC1D-482...|
+--------------------+

Строковый столбец состоит из последовательностей символов, разделенных пробелами. Если последовательность символов начинается с 0, я хочу вернуть второе число и последний номер последовательности. Второе число может быть любым числом от 0 до 8.

Array("8,3", "6,1", "7,1", "6,1", "7,1", "8,3")

Затем я хочу преобразовать массив пар в 9 столбцов, причем первое число пары является столбцом, а второе число - значением. Если число отсутствует, оно получит значение 0. Например

val df= Seq(("0003C32C-FC1D-482F-B543-3CBD7F0A0E36 0,8,1,799,300:3  0,6,1,330,300:1  2,6,1,15861:1 0,7,1,734,300:1 0,6,0,95,300:1 2,7,1,15861:1 0,8,0,134,300:1")).).toDF("col_str", "col0", "col1", "col2", "col3", "col4", "col5", "col6", "col7", "col8")

+--------------------+----+----+----+----+----+----+----+----+----+
|             col_str|col0|col1|col2|col3|col4|col5|col6|col7|col8|
+--------------------+----+----+----+----+----+----+----+----+----+
|0003C32C-FC1D-482...|   0|   0|   0|   0|   0|   0|   1|   1|   3|
+--------------------+----+----+----+----+----+----+----+----+----+

Мне все равно, будет ли решение в Scala или Python.

1 Ответ

0 голосов
/ 09 мая 2018

Вы можете сделать следующее (прокомментировано для ясности)

//string defining
val str = """0003C32C-FC1D-482F-B543-3CBD7F0A0E36 0,8,1,799,300:3  0,6,1,330,300:1  2,6,1,15861:1 0,7,1,734,300:1 0,6,0,95,300:1 2,7,1,15861:1 0,8,0,134,300:3"""
//string splitting with space
val splittedStr = str.split(" ")
//parsing the splitted string to get the desired format with the second element as key and the last element as value of the elements starting with 0
val parsedStr = List(("col_str"->splittedStr.head)) ++ splittedStr.tail.filter(_.startsWith("0")).map(value => {val splittedValue = value.split("[,:]"); ("col"+splittedValue(1)->splittedValue.last)}) toMap
//expected header names
val expectedHeader = Seq("col_str", "col0", "col1", "col2", "col3", "col4", "col5", "col6", "col7", "col8")
//populating 0 for the missing header names in the parsed string in above step
val missedHeaderWithValue = expectedHeader.diff(parsedStr.keys.toSeq).map((_->"0")).toMap
//combining both the maps
val expectedKeyValues = parsedStr ++ missedHeaderWithValue
//converting to a dataframe
Seq(expectedDF(expectedKeyValues(expectedHeader(0)), expectedKeyValues(expectedHeader(1)), expectedKeyValues(expectedHeader(2)), expectedKeyValues(expectedHeader(3)), expectedKeyValues(expectedHeader(4)), expectedKeyValues(expectedHeader(5)), expectedKeyValues(expectedHeader(6)), expectedKeyValues(expectedHeader(7)), expectedKeyValues(expectedHeader(8)), expectedKeyValues(expectedHeader(9))))
  .toDF()
  .show(false)

что должно дать вам

+------------------------------------+----+----+----+----+----+----+----+----+----+
|col_str                             |col0|col1|col2|col3|col4|col5|col6|col7|col8|
+------------------------------------+----+----+----+----+----+----+----+----+----+
|0003C32C-FC1D-482F-B543-3CBD7F0A0E36|0   |0   |0   |0   |0   |0   |1   |1   |3   |
+------------------------------------+----+----+----+----+----+----+----+----+----+

и, конечно, вам понадобится expectedDF case class, определенный где-то вне области действия

case class expectedDF(col_str: String, col0: String, col1: String, col2: String, col3: String, col4: String, col5: String, col6: String, col7: String, col8: String)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...