将具有地址和坐标的列转换为带有.astype(str)的字符串会丢弃坐标

时间:2018-03-23 11:09:05

标签: 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

我想从这里获取坐标

使用提取似乎不起作用,只是返回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

2 个答案:

答案 0 :(得分:1)

您可以尝试使用.apply.str

<强>实施例

def getLatLog(d):
    try:
        return re.findall(r"\d+\.\d+", d)
    except:
        return [None, None]

df['g_latitude'], df['g_longitude'] = df["geocode_result2"].apply(lambda x: getLatLog(x)).str
print(df["g_latitude"])
print(df["g_longitude"])

<强>输出:

0      5.534454
1     5.6864962
2    5.77329565
Name: g_latitude, dtype: object
0             0.700763
1            0.1677052
2    0.110766330148484
Name: g_longitude, dtype: object

答案 1 :(得分:1)

geolocator.geocode返回Location个对象而不是字符串(尽管它的字符串表示实际上包含你试图解析的lat / long),因此可以通过访问{{1}来检索lat / long分别是/ location.latitude属性。

location.longitude

Result

(由于声誉不足,我无法发表评论,所以我在这里回答坐标会引起混淆)。

# 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) 返回文本地址(没有坐标),但str(location)返回以下格式的字符串(包括坐标):

repr(location)

您在打印时看到的内容Location(%(address)s, (%(latitude)s, %(longitude)s, %(altitude)s)) 使用data(为简洁起见,pandas似乎会删除前导repr类型),因此您可以看到坐标。但是当列转换为Location时,它会使用str表示,但不包含坐标。这就是整个魔术。