地理编码 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)
我有一个愚蠢的问题:我正在尝试对德国的几个城镇进行地理编码,这些城镇的名称存储在数据框中的一列中。该编码适用于除明斯特以外的所有城镇。
我的数据框看起来像这样(在这里粘贴有趣的部分):
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)