python - 使用 .astype(str) 将包含地址和坐标的列转换为字符串会删除坐标

标签 python regex string geocoding geopy

我正在使用 geopy 包搜索地址的坐标,列返回匹配的地址和坐标

我只想获取坐标

这是一个向您展示其工作原理的测试:

# Test to see if response is obtained for easy address
location = geolocator.geocode("175 5th Avenue NYC", timeout=10)
print((location.latitude, location.longitude))

>>> (40.7410861, -73.9896298241625)

在我的代码中,我有一个包含城市的 CSV,然后使用 geopy 包进行查找

data['geocode_result'] = [geolocator.geocode(x, timeout = 60) for x in data['ghana_city']]

enter image description here

我只想从这里获取坐标

尽管正则表达式很好,但使用 extract 似乎不起作用并且只返回 NaN 值:

p = r'(?P<latitude>-?\d+\.\d+)?(?P<longitude>-?\d+\.\d+)'
data[['g_latitude', 'g_longitude']] = data['geocode_result2'].str.extract(p, expand=True)
data

我感觉这些问题是由于列中 geopy 返回的对象造成的

正则表达式是健全的,经 Regexr.com 验证:

enter image description here

我尝试将列转换为字符串,但坐标被删除?!

data['geocode_result2'] = (data['geocode_result2']).astype(str)
data

enter image description here

有人可以帮忙吗?非常感谢

<小时/>

虚拟数据:

我要从中提取坐标的列是 geocode_result2 或 geocode_result

     geocode_result2
1    (Agona Swedru, Central Region, Ghana, (5.534454, -0.700763))
2    (Madina, Adenta, Greater Accra Region, PMB 107 MD, Ghana, (5.6864962, -0.1677052))
3    (Ashaiman, Greater Accra Region, TM3 8AA, Ghana, (5.77329565, -0.110766330148484))
<小时/>

获取坐标的最终代码:

data['geocode_result'] = [geolocator.geocode(x, timeout = 60) for x in data['ghana_city']]
x = data['geocode_result']
data.dropna(subset=['geocode_result'], inplace=True)
data['g_latitude'] = data['geocode_result'].apply(lambda loc: loc.latitude)
data['g_longitude'] = data['geocode_result'].apply(lambda loc: loc.longitude)
data

最佳答案

geolocator.geocode 返回 Location 对象而不是字符串(尽管它的字符串表示形式实际上包含您试图解析的纬度/经度),因此纬度/经度可以通过分别访问 location.latitude/location.longitude 属性来检索。

# Make geocoding requests
data['geocode_result'] = [geolocator.geocode(x, timeout = 60) for x in data['ghana_city']]
# Extract lat/long to separate columns
data['g_latitude'] = data['geocode_result'].apply(lambda loc: loc.latitude)
data['g_longitude'] = data['geocode_result'].apply(lambda loc: loc.longitude)

Result

(由于缺乏声誉,我无法发表评论,所以我在这里回答坐标下降的困惑)。

str(location) 返回文本地址(不带坐标),但 repr(location) 返回以下格式的字符串(包含坐标):

Location(%(address)s, (%(latitude)s, %(longitude)s, %(altitude)s))

打印 data 时看到的内容使用 repr (为了简洁起见,pandas 似乎放弃了领先的 Location 类型),因此您可以看到该坐标。但是,当列转换为 str 时,它使用 str 表示形式,其中不包含坐标。这就是这里的全部魔力。

关于python - 使用 .astype(str) 将包含地址和坐标的列转换为字符串会删除坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49448335/

相关文章:

python - 使用 Python 将文本格式化为表格形式

python - 解析 Pandas 中的列值

javascript - 时间格式的正则表达式,如 DD :HH:MM:SS

c# - 正则表达式在 .NET 中查找标记值

string - Bash:获取点字符后的子字符串,进行比较

javascript - 使用正则表达式替换以 @ 开头的子字符串

python - 集成 Qt Designer 和 PyCharm

python - 订购用于绘图的多边形坐标

python - 如何从字典中创建一个句子

c# - 特殊字符的正则表达式