Исходя из моего ответа на функцию из SO, вы можете сделать это так:
Интересно, что этот ответ также в 2 раза быстрее, чем MaxU и Amis отвечают за набор данных с +500 строками. Держу пари, что узким местом является str.extract (). Но что-то явно странное.
import pandas as pd
import re
#https://stackoverflow.com/questions/33997361
def dms2dd(s):
# example: s = """0°51'56.29"S"""
degrees, minutes, seconds, direction = re.split('[°\'"]+', s)
dd = float(degrees) + float(minutes)/60 + float(seconds)/(60*60);
if direction in ('S','W'):
dd*= -1
return dd
df = pd.DataFrame({'CPO': {0: 'Raya', 1: 'Raya'},
'Latitude': {0: '0°51\'56.29"S', 1: '1°23\'39.29"S'},
'Longitude': {0: '101°26\'46.29"E', 1: '101°35\'30.45"E'},
'PKO': {0: 'X', 1: 'X'},
'ParentCompany': {0: 'Incasi', 1: 'Incasi'}})
df['Latitude'] = df['Latitude'].apply(dms2dd)
df['Longitude'] = df['Longitude'].apply(dms2dd)
печать df возвращает:
CPO Latitude Longitude PKO ParentCompany
0 Raya -0.865636 101.446192 X Incasi
1 Raya -1.394247 101.591792 X Incasi
Обновление: Чтобы исправить свою ошибку, вы можете сделать что-то в строках:
m = df['Latitude'].str[-2] != '"'
df.loc[m, 'Latitude'] = df.loc[m, 'Latitude'].str[:-1] + '"' + df.loc[m, 'Latitude'].str[-1]
Полный пример:
import re
s1 = """0°51'56.29"S"""
s2 = """0°51'56.29S"""
df = pd.Series((s1,s2)).to_frame(name='Latitude')
m = df['Latitude'].str[-2] != '"'
df.loc[m, 'Latitude'] = df.loc[m, 'Latitude'].str[:-1] + '"' + df.loc[m, 'Latitude'].str[-1]
print(df)