Как разбить данные из одного столбца и вставить их в два новых?
Нужно из столбца Общие данные (красный) вырезать гео-данные и вставить в два столбца - Широта и Долгота (синие).
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
