地理编码 returns 应用于数据框时的城镇错误 - returns 应用于文本时的城镇正确

Geocoding returns wrong town when applied to dataframe - returns correct one when applied to text

我有一个愚蠢的问题:我正在尝试对德国的几个城镇进行地理编码,这些城镇的名称存储在数据框中的一列中。该编码适用于除明斯特以外的所有城镇。

我的数据框看起来像这样(在这里粘贴有趣的部分):

68  1034291939  Lüneburg        2010    330       (Lüneburg, Niedersachsen, Deutschland, (53.248...
69  1003394345  Kassel          2010    330       (Kassel, Niestetal, Hessen, Deutschland, (51.3...
70  100975873X  Magdeburg       2010    330.157   (Magdeburg, Sachsen-Anhalt, Deutschland, (52.1...
71  1191280594  Ludwigsburg     2010    340       (Ludwigsburg, Landkreis Ludwigsburg, Baden-Wür...
72  1010526499  Potsdam         2010    338.947   (Potsdam, Brandenburg, Deutschland, (52.400930...
73  1008154156  Duisburg        2010    658.72    (Duisburg, Nordrhein-Westfalen, Deutschland, (...
74  1011028336  Münster         2010    330       (Munster, Éire / Ireland, (52.307621600000004,...
75  1008507016  Jena            2010    338.04    (Jena, Thüringen, Deutschland, (50.9281717, 11...

如您所见,数据框中还有其他城镇名称包含特殊字符,例如“ü”(“Lüneburg”),不会造成任何问题,但明斯特 - 无论出于何种原因 - 被地理编码为明斯特在爱尔兰。作为记录,我使用以下代码对城镇名称进行地理编码:

df_geo['geo_code'] = df_short.Ort.apply(geocode)

我已经尝试检查这是否是数据库的一般问题,但如果我 运行 location = geocode('Münster')就returnsMünster, Nordrhein-Westfalen, Deutschland就好了。我现在完全不知道为什么当我将它应用于数据框时它不起作用。我认为这可能是 ü 的问题,但我从中读取数据的 table 是用 utf-8 编码的,并且在我打开它时正确显示 ü(例如 Excel)。有谁知道问题可能是什么以及我该如何解决? 运行在数据帧上进行地理编码之前,我是否需要对数据进行不同的编码或解码?

编辑:编辑了数据框,以便更容易发现不同的列

Edit2: 为了解决这个问题,我现在尝试提取位置名称并将它们转储到一个列表中,然后 运行 该列表循环通过地理编码器,但我仍然有同样的问题:除了 Münster 之外的所有名称都正确转换,Münster 总是被编码为 Munster, Ireland。我尝试了以下代码:

for entry in places: 
    location = geocode(places)
    print(location)

此外,我随后再次尝试对字符串进行地理编码,突然之间 Münster 也转向了 Munster。有趣的是,我现在发现,使用 " " 作为字符串与 ' ':

之间似乎存在差异
location = geocode("Münster")
print(location)
location2 = geocode('Münster')
print(location2)

returns:

Munster, Éire / Ireland
Münster, Nordrhein-Westfalen, Deutschland

这是为什么?所以我现在认为问题是当我使用变量(位置)时,它以某种方式将代码视为双引号,而我需要将其视为单引号。我该如何改变它?我认为将所有名称转换为字符串并不能真正解决问题(因为它们已经是字符串)并且会变得不必要地复杂...

所以,经过反复试验,我终于发现底层编码有问题。我添加了以下代码,现在地理编码运行顺利,并将“Münster”翻译成德国的 Münster。

def normalize(text): 
    new = unicodedata.normalize('NFC', text)
    return new 

df_geo['Ort'] = df_geo['Ort'].apply(normalize)

places = df_geo['Ort'].tolist()

for entry in places: 
    location = geocode(entry)
    print(location)