Удалить фразу и скобки и отсортировать фрейм данных - PullRequest
1 голос
/ 03 ноября 2019

Приведенный пример фрейма данных:

df = 

                               multi
0 MULTIPOLYGON(((1.1 1.2, 2.1 2.2)))
1 MULTIPOLYGON(((3.1 3.2, 4.1 4.2)))
2 MULTIPOLYGON(((5.1 5.2, 6.1 6.1)))

Неправильный вывод:

df = 

 a_1 b_1 a_2 b_2 a_3 b_3
 1.1 1.2 3.1 3.2 5.1 5.2
 2.1 2.2 4.1 4.2 6.1 6.2

Я проделал очень долгий процесс, который очень плохо даже поставить здесь.

  1. Шаг первый:

Удалить MULTIPOLYGON, затем (((, затем )))

Шаг второй:

Разделить на запятую

Шаг третий:

Транспонировать, а затем разделить на пробелы

Я уверен, что должен быть более хороший и мудрый способ сделать это (это легко сделать в Excel, ноМне нужно сделать с питоном)

1 Ответ

1 голос
/ 03 ноября 2019

Используя str.extract, str.split, transform и pd.concat:

Мы можем сделать это в несколько шагов:

  1. Сначала мы извлекаем числа между ((( ... )))
  2. Затем мы разбиваем , и transform строки на столбцы
  3. Разбиваем каждые два числа на пробелы и concat новые данные располагаются рядом
temp = df['multi'].str.extract('\(\(\((.*)\)\)\)')[0].str.split(',', expand=True).T

df_new = pd.concat(
    [temp[col].str.strip().str.split(' ', expand=True)\
     .rename(columns={0:f'a_{n+1}', 1:f'b_{n+1}'}) 
     for n, col in enumerate(temp.columns)], axis=1
)

Вывод

   a_1  b_1  a_2  b_2  a_3  b_3
0  1.1  1.2  3.1  3.2  5.1  5.2
1  2.1  2.2  4.1  4.2  6.1  6.2

Более подробное объяснение:

list comprehension может выглядеть довольно сложным, так пишется как обычный for loop, это:

newdata = []
for n, col in enumerate(temp.columns):
    dftemp = temp[col].str.strip().str.split(' ', expand=True)
    dftemp = dftemp.rename(columns={0:f'a_{n+1}', 1:f'b_{n+1}'}) 

    newdata.append(dftemp)

newdf = pd.concat(newdata, axis=1)
...