I am not able to transfer a pandas dataframe column with geolocation coordinates into a Geopandas Point format.

location = pd.read_csv('City_addresses')
print location['Geolocation'].head()

Outputs the following:

0    (50.673675, -120.298973)
1    (50.678354, -120.329258)
2    (50.672496, -120.333317)
3    (50.673359, -120.332912)
4    (50.673411, -120.32978)
Name: Geolocation, dtype: object

Then I attempt to transfer it to Geopandas Point coordinates.

from shapely.geometry import Point
from geopandas import GeoDataFrame

location['Geolocation'] = location['Geolocation'].apply(Point)
gpd = gpd.GeoDataFrame(location, geometry='Geolocation', crs={'init': 'epsg:4326'})

print gpd

To which I get:

TypeError: a float is required

But it won't allow me to change the datatype to a float in pandas either. What should I do?


Your coordinates are string representations of tuples, for example "(50.673675, -120.298973)" but:

The Point constructor takes positional coordinate values or point tuple parameters.

So you need to convert the string to 50.673675 and -120.298973 or (50.673675, -120.298973). You can use eval:

location['geometry'] = location.Geolocation.apply(lambda x: Point(eval(x))

Your coordinates are stored inside tuples. However, to construct a GeoPandas Object, you need a column usually named "geometry" which store shapely.geometry objects. In your case, the object needs to be Point objects. Therefore, the code to construct a GeoPandasDataFrame would look like:

from shapely.geometry import Point

location = pd.read_csv('City_addresses')
location["geometry"] = location.apply(lambda x: Point(x["Geolocation"][0], x["Geolocation"][1]) , axis = 1)
gdf = gpd.GeoDataFrame(location, geometry='geometry', crs={'init': 'epsg:4326'})
  • You can also do: location['geometry'] = location.Geolocation.apply(lambda x: Point(eval(x))) – BERA Jul 17 '18 at 8:07
  • 1
    @BERA Your solution worked for me! Thank you! – user4718221 Jul 20 '18 at 23:34
  • @yimcai Your solution is giving me a type error, says that the float type is required – user4718221 Aug 5 '18 at 5:32
  • @BERA good to know. – yimcai Aug 5 '18 at 9:20
  • @user4718221 sorry I did not notice that (50.673675, -120.298973) is actually stored as String type "(50.673675, -120.298973)". My method requires some extra string parsing work. Instead, BERA provides a shortcut to save work to parse "(50.673675, -120.298973)" – yimcai Aug 5 '18 at 10:00

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.