Как разбить данные из одного столбца и вставить их в два новых?

Нужно из столбца Общие данные (красный) вырезать гео-данные и вставить в два столбца - Широта и Долгота (синие).

import pandas
    
data = {'Имя': ['Москва, 1п.', 'Питер, 2п', 'Владик 3пп', 'Калининград'],
            'Координаты': ['53.2555095749943, 83.6533059729708',
                           '53.2555095749943, 83.6533059729708',
                           '53.25932749912, 83.6534465959292',
                           '53.25932749912, 83.6534465959292']}
    
    
data2 = pandas.DataFrame(data)
    
data2['Общие данные'] = data2['Имя'] + ', ' + data2['Координаты'].astype(str)
    
data2.sort_values(['Общие данные'], axis=0, ascending=True, inplace=True)
    
data2.to_excel('test1.xlsx')

введите сюда описание изображения


Ответы (3 шт):

Автор решения: CrazyElf

Наверняка можно как-то более "векторно" это сделать, используя строковые функции самого Pandas, но навскидку можно так, работает:

def split_data(data, n):
    for line in data:
        yield float(line.split(',')[n].strip())

data2['Широта'] = list(split_data(data2['Общие данные'].values, -2))
data2['Долгота'] = list(split_data(data2['Общие данные'].values, -1))
→ Ссылка
Автор решения: MaxU

Воспользуйтесь методом Series.extractall():

data2[["Широта", "Долгота"]] = (
    data2["Общие данные"]
    .str.extractall(r"\b(\d+\.\d+),\s*(\d+\.\d+)\b").reset_index(level=1, drop=True)
    .astype("float")
)

результат:

In [192]: data2
Out[192]:
           Имя                          Координаты                                     Общие данные     Широта    Долгота
0  Москва, 1п.  53.2555095749943, 83.6533059729708  Москва, 1п., 53.2555095749943, 83.6533059729708  53.255510  83.653306
1    Питер, 2п  53.2555095749943, 83.6533059729708    Питер, 2п, 53.2555095749943, 83.6533059729708  53.255510  83.653306
2   Владик 3пп    53.25932749912, 83.6534465959292     Владик 3пп, 53.25932749912, 83.6534465959292  53.259327  83.653447
3  Калининград    53.25932749912, 83.6534465959292    Калининград, 53.25932749912, 83.6534465959292  53.259327  83.653447

In [193]: data2.dtypes
Out[193]:
Имя              object
Координаты       object
Общие данные     object
Широта          float64
Долгота         float64
dtype: object
→ Ссылка
Автор решения: strawdog
data2[["Широта", "Долгота"]] = pandas.DataFrame(data2["Координаты"]
                                                .str.split(",",expand=True), index = data2.index)

результат:

           Имя                          Координаты                                     Общие данные            Широта            Долгота
2   Владик 3пп    53.25932749912, 83.6534465959292     Владик 3пп, 53.25932749912, 83.6534465959292    53.25932749912   83.6534465959292
3  Калининград    53.25932749912, 83.6534465959292    Калининград, 53.25932749912, 83.6534465959292    53.25932749912   83.6534465959292
0  Москва, 1п.  53.2555095749943, 83.6533059729708  Москва, 1п., 53.2555095749943, 83.6533059729708  53.2555095749943   83.6533059729708
1    Питер, 2п  53.2555095749943, 83.6533059729708    Питер, 2п, 53.2555095749943, 83.6533059729708  53.2555095749943   83.6533059729708

UPDATE

после уточнений автора вопроса, что из колонки с общими данными нужно убрать все, кроме городов:

# сначала нужно заменить запятую, которая встречается в названии города:
data2['Общие данные'] = data2['Имя'].str.replace(",",";") + ', ' + data2['Координаты'].astype(str)

# а затем уже сделать наше преобразование, но уже для 3 колонок:
data2[["Общие данные", "Широта", "Долгота"]] = pd.DataFrame(data2["Общие данные"]
                                                .str.split(",", expand=True), index = data2.index)

результат:

           Имя                          Координаты Общие данные             Широта            Долгота
2   Владик 3пп    53.25932749912, 83.6534465959292   Владик 3пп     53.25932749912   83.6534465959292
3  Калининград    53.25932749912, 83.6534465959292  Калининград     53.25932749912   83.6534465959292
0  Москва, 1п.  53.2555095749943, 83.6533059729708  Москва; 1п.   53.2555095749943   83.6533059729708
1    Питер, 2п  53.2555095749943, 83.6533059729708    Питер; 2п   53.2555095749943   83.6533059729708
→ Ссылка