Convert latitude and longitude to float

Question:

I have a dataframe df like these
3 first rows are these

City Longitude Latitude
Toluca W099.6569 N19.2925
Pune E73.8562 N18.5167
Bloemfontain E026.216667 S29.116667

For example Bloemfontain row should be like these at the end

City Longitude Latitude
Bloemfontain -29.116667 26.216667

I used this code

pattern = r'(?P<d>[d.]+).*?(?P<m>[d.]+).*?(?P<s>[d.]+)'
dms = df['Latitude'].str.extract(pattern).astype(float)
df['LATITUDE'] = dms['d'] + dms['m'].div(60) + dms['s'].div(3600)
dms = df['Longitude'].str.extract(pattern).astype(float)
df['LONGITUDE'] = dms['d'] + dms['m'].div(60) + dms['s'].div(3600)

but got not the right longitude and latitude

Asked By: Mary Abela

||

Answers:

I don’t see where it is necessary to utilize a pattern search at all. Here is how I would do the task.

# function to perform the partitioning
def cnvrtCoord(val: str) -> float:
    sgn = +1
    if val[0] == 'S' or val[0] == 'W':
        sgn = -1
    return float(val[1:]) * sgn  

Then to change the contents of the Longitude and Latitude columns use:

df['Longitude'] = [cnvrtCoord(x) for x in df['Longitude'].tolist()]
df['Latitude'] = [cnvrtCoord(x) for x in df['Latitude'].tolist()]  

This would produce the dataframe shown below given your input sample:

    City    Longitude   Latitude
0   Toluca  -99.656900  19.292500
1   Pune    73.856200   18.516700
2   Bloemfontain    26.216667   -29.116667
Answered By: itprorh66
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.