My geopandas df looks like this:
JavaScript
x
4
1
events datum pz dst Aktenzahl geometry
2
0 22 2015.0 204 BSm BSm/204/30/2015 [16.34203, 48.21717]
3
1 22 2015.0 202 BSm BSm/202/8/2015 [16.34189, 48.21719]
4
As you can see, the geometry column is a list containing longitude and latitude values. Is there an efficient way to convert them to points?
This works but is very inefficient:
JavaScript
1
12
12
1
pts = gpd.GeoDataFrame(geometry=gpd.points_from_xy(
2
[df['geometry'][0][0], df['geometry'][1][0]],
3
[df['geometry'][0][1], df['geometry'][1][1]]))
4
5
df["geometry"] = pts
6
df = gpd.GeoDataFrame(df, crs='epsg:4326').set_geometry('geometry')
7
df
8
9
events datum pz dst Aktenzahl geometry
10
0 22 2015.0 204 BSm BSm/204/30/2015 POINT (16.34203 48.21717)
11
1 22 2015.0 202 BSm BSm/202/8/2015 POINT (16.34189 48.21719)
12
When I put this in a loop I get TypeError: len() of unsized object
JavaScript
1
4
1
for i in range(len(df['geometry'])):
2
print(df['geometry'][i][0], df['geometry'][i][1]) # works
3
print(gpd.GeoDataFrame(geometry=gpd.points_from_xy(df['geometry'][i][0], df['geometry'][i][1]))) # TypeError: len() of unsized object
4
Basically I need the inverse of this question.
Reproducible data here:
JavaScript
1
2
1
df={'events': {0: 22, 1: 22}, 'datum': {0: 2015.0, 1: 2015.0}, 'pz': {0: 204, 1: 202}, 'strasse': {0: 'Hernalser Gürtel', 1: 'Hernalser Gürtel'}, 'hnr': {0: 'unter U6', 1: 'unter U6'}, 'dst': {0: 'BSm', 1: 'BSm'}, 'Aktenzahl': {0: 'BSm/204/30/2015', 1: 'BSm/202/8/2015'}, 'geometry': {0: [16.34203, 48.21717], 1: [16.34189, 48.21719]}}
2
Advertisement
Answer
I don’t know why you want a loop.
JavaScript
1
5
1
df={'events': {0: 22, 1: 22}, 'datum': {0: 2015.0, 1: 2015.0}, 'pz': {0: 204, 1: 202}, 'strasse': {0: 'Hernalser Gürtel', 1: 'Hernalser Gürtel'}, 'hnr': {0: 'unter U6', 1: 'unter U6'}, 'dst': {0: 'BSm', 1: 'BSm'}, 'Aktenzahl': {0: 'BSm/204/30/2015', 1: 'BSm/202/8/2015'}, 'geometry': {0: [16.34203, 48.21717], 1: [16.34189, 48.21719]}}
2
df = pd.DataFrame(df)
3
df.geometry = gpd.points_from_xy(df.geometry[0], df.geomety[1])
4
gdf = gpd.GeoDataFrame(df, geometry='geometry', crs = 'epsg:4326)
5
All coordinates have been changed to points.
Do you think this is really inefficient?
Update
sorry, I have a mistake. I think the solution you want is this.
JavaScript
1
2
1
df.geometry = gpd.points_from_xy(pd.DataFrame(df.geometry.to_list())[0], pd.DataFrame(df.geometry.to_list())[1])
2