Pandas列使用map()函数将字符串转换为Shapely点

2024-10-03 23:26:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个观测数据集,其中包含(纬度、经度)数据,格式如下:
'POINT (30.6280359000000004 -96.3051219999999972)'
'POINT (40.7815247999999997 -74.0058204000000046)'

我正在尝试将这些字符串解析为Shapely点,以便可以在GeoPandas数据帧中使用它们。我编写了一个简单的函数来解析字符串:parse_point。这在一个由Pandas列中的单个记录组成的测试字符串上工作得很好,“GeoTagStart”。但是,map函数给出的错误列表索引超出范围,请参见下文。通过在代码执行时使用print,我可以看到下面的pandas map()函数将列视为单个数组或列表,而我已经知道pandas列上的map()函数是逐行工作的。你知道我哪里出错了吗?怎么做?可能是简单的东西,但我看不出来。 谢谢!在

from shapely.geometry import Point

def parse_point(record):
    pieces = record.split() # splits each record into a list of 3
    x = float(pieces[1].lstrip('(')) # latitude
    y = float(pieces[2].rstrip(')')) # longitude 
    point = Point(x,y) # convert to Shapely Point
    return point

test1 = df['GeoTagStart'][3]
test2 = df['GeoTagStart'][50]    

print(parse_point(test1))
assert type(parse_point(test1)) == Point # this works fine, returns  shapely.geometry.point.Point

print(parse_point(test2))
assert type(parse_point(test2)) == Point # this works fine

df['new_col'] = df['momGeoTagStart'].map(lambda x: parse_point(x)) # this throws an error: 

<ipython-input-5-92a2b4f58255> in <lambda>(x)
     24 assert type(parse_point(test2)) == Point
     25 
---> 26 df['new_col'] = df['GeoTagStart'].map(lambda x: parse_point(x))
     27 

<ipython-input-5-92a2b4f58255> in parse_point(record)
     13 def parse_point(record):
     14     pieces = record.split()
---> 15     x = float(pieces[1].lstrip('('))
     16     y = float(pieces[2].rstrip(')'))
     17     point = Point(x,y)

IndexError: list index out of range

Tags: 数据函数字符串mapdfparsefloatrecord
1条回答
网友
1楼 · 发布于 2024-10-03 23:26:36

你应该“初始化”你的坐标系

import geopandas as gpd
import folium 

df = gpd.GeoDataFrame.from_file('shapefile.shx')
df.crs = {'init' :'epsg:28992'}

m = folium.Map([52,5.8],tiles='cartodbpositron', zoom_start=8) 

folium.GeoJson(df).add_to(m)

m

相关问题 更多 >