地理编码在应用于数据框时返回错误的城镇 - 在应用于文本时返回正确的城镇
Posted
技术标签:
【中文标题】地理编码在应用于数据框时返回错误的城镇 - 在应用于文本时返回正确的城镇【英文标题】:Geocoding returns wrong town when applied to dataframe - returns correct one when applied to text 【发布时间】:2021-10-31 19:55:35 【问题描述】:我有一个愚蠢的问题:我正在尝试对德国的几个城镇进行地理编码,这些城镇的名称存储在数据框中的一列中。编码适用于所有城镇,除了一个:明斯特。
我的数据框看起来像这样(在此处粘贴有趣的部分):
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')
它返回 Münster, Nordrhein-Westfalen, Deutschland
就好了。我现在完全不知道为什么当我将它应用于数据框时它不起作用。我认为这可能是 ü 的问题,但是我从中读取数据的表是用 utf-8 编码的,并且当我打开它时(例如在 Excel 中)正确显示 ü。有谁知道问题可能是什么以及我该如何解决?在对数据帧运行地理编码之前,我是否需要对数据进行不同的编码或解码?
编辑:编辑数据框以便更容易发现不同的列
Edit2:为了解决这个问题,我现在尝试提取位置名称并将它们转储到一个列表中,然后通过地理编码器循环运行该列表,但我仍然遇到同样的问题:所有名称都正确转换,除了 Münster,它总是被编码为 Munster, Ireland。我尝试了以下代码:
for entry in places:
location = geocode(places)
print(location)
此外,我随后再次尝试对字符串进行地理编码,突然间,明斯特也转向了明斯特。有趣的是,我现在发现,使用 " " 作为字符串与 ' ' 之间似乎存在差异:
location = geocode("Münster")
print(location)
location2 = geocode('Münster')
print(location2)
返回:
Munster, Éire / Ireland
Münster, Nordrhein-Westfalen, Deutschland
这是为什么呢?所以我现在认为问题在于,当我使用变量(位置)时,它会以某种方式将代码视为双引号,而我需要将其视为单引号。我该如何改变呢?我想将所有名称转换为字符串并不能真正解决问题(因为它们已经是字符串)并且会不必要地复杂......
【问题讨论】:
不是因为330移位了吗?我的意思是这是巧合吗?尝试改变它的位置或手动修改坐标。 330 不是地理编码使用的列的一部分,它位于单独的列中。 我现在什至尝试将字符串包装成单引号,虽然这在直接使用字符串时有效,但一旦我将其解析为变量,它仍然不起作用。老实说,我不明白这一点。 【参考方案1】:所以,经过多次反复试验,我终于发现底层编码存在问题。我添加了以下代码,现在地理编码运行顺利,并将“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)
【讨论】:
以上是关于地理编码在应用于数据框时返回错误的城镇 - 在应用于文本时返回正确的城镇的主要内容,如果未能解决你的问题,请参考以下文章