熊猫:将格式选项传递给函数

时间:2017-05-11 12:06:06

标签: python pandas geopy

我想从邮政编码中提取坐标作为新的df列。

geopy模块的功能是:

from geopy.geocoders import Nominatim
geolocator = Nominatim()
location = geolocator.geocode('%s tn6 3rn')

print((location.latitude, location.longitude))
(51.0459837, 0.2192646)

我将此功能应用于单个值的工作原理:

def pcodeToCoor(x):
    geolocator = Nominatim()
    location = geolocator.geocode(x)
    return ((location.latitude, location.longitude))

pcodeToCoor('%s tn6 3rn')
(51.0459837, 0.2192646)

但是在将函数传递给测试df:

    name    postcode
0   jd      tn6 3rn
1   hf      en6 1dg
2   ss      sw17 0ju

df['coordinate'] = df['postcode'].map(pcodeToCoor)

我得到AttributeError: 'NoneType' object has no attribute 'latitude。注意我可以通过从基本api功能中删除%s来重新创建此错误。

问题是,如何在我的函数中使用%s?我想答案很简单,但我尝试过的都没有用!

1 个答案:

答案 0 :(得分:1)

如果您要以这种方式一致地使用此功能,或者您对代码进行代码检查以查看您的字符串是否以"%s"

开头,您可以执行此类操作。
def pcodeToCoor(x):
    geolocator = Nominatim()
    location = geolocator.geocode('%s '+x)
    return ((location.latitude, location.longitude))

编辑:

def pcodeToCoor(x):
    if x[0:2] != '%s':
        x = '%s ' + x 
    geolocator = Nominatim()
    location = geolocator.geocode(x)
    return ((location.latitude, location.longitude))

测试:

pcodeToCoor('%s tn6 3rn')

输出:

(51.0459837, 0.2192646)

测试2:

df['postcode'].map(pcodeToCoor)

输出:

0     (51.0459837, 0.2192646)
1    (51.7206134, -0.2042041)
2    (51.3866947, -0.1800573)
Name: postcode, dtype: object