【问题标题】:Converting a column with address and coordinates to string with .astype(str) drops the coordinates使用 .astype(str) 将具有地址和坐标的列转换为字符串会丢弃坐标
【发布时间】:2018-03-23 11:09:04
【问题描述】:

我正在使用 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']]

我只想从这里获取坐标

使用 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 上验证:

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

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

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


虚拟数据:

我要从中提取坐标的列是 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

【问题讨论】:

  • 试试p = r'(?P&lt;latitude&gt;-?\d+\.\d+),\s*(?P&lt;longitude&gt;-?\d+\.\d+)' 2个值之间有逗号和空格符吧?
  • 感谢您的帮助,我之前实际上已经尝试过。并且还尝试使正则表达式非常简单。我感觉是 .str 工作不正常
  • 当我在列上执行 dtype 时,它​​返回 'object' 这并不可疑,但我似乎无法在不删除坐标的情况下转换该死的东西,这是我认为我需要的为提取物工作

标签: python regex string geocoding geopy


【解决方案1】:

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 表示,其中不包括坐标。这就是这里的全部魔力。

【讨论】:

  • 感谢您的回答,使用您的代码“'NoneType' 对象没有属性'纬度'”时出现错误
  • 您必须先删除 None 的行。试试data = data.dropna(axis=0)
  • 就是这样 - 感谢 Kostya 所做的一切
【解决方案2】:

您可以尝试使用.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

【讨论】:

  • 感谢 Rakesh,这实际上是在抛出错误“没有足够的值来解压(预期为 2,得到 0)”——这似乎没有意义,因为至少前几行在数据框包含浮点数
  • 您能否发布您的数据['geocode_result2'] 以便我进行测试。它适用于我的虚拟数据
  • 干杯,我已经编辑了我的答案以包含来自 geocode_result2 的 3 行
  • 有趣的是当我从 'data['g_latitude'], data['g_longitude'] = data["geocode_result2"].apply(lambda x: getLatLog(x)).str 中删除 .str ' 我有 ;太多的值无法解压
  • 您是否认为我的列是从 geopy 包的响应中获取的,而不是我在列中输入字符串,这导致了问题?
猜你喜欢
  • 2022-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多