用Python绘制15000个城市地图的有效方法

用Python绘制15000个城市地图的有效方法,python,algorithm,sorting,dataframe,Python,Algorithm,Sorting,Dataframe,我有一组大约15k的观测数据。这是来自世界各地的城市名称。这个数据集由来自许多不同国家的人填充,这意味着我有几个相同城市的不同语言的副本。见下文DF摘录: 城市名称 布鲁塞拉斯 布鲁塞尔 布鲁塞尔 布鲁塞尔 布鲁塞尔奥德格姆酒店 布鲁塞尔 比利时布鲁塞尔酒店 门兴 蒙钦斯坦 蒙奇维伦 蒙德金根 蒙多尔谢姆 蒙吉亚 蒙古亚 慕尼黑 慕尼黑 慕尼黑 德国慕尼黑 慕尼黑慕尼黑慕尼黑 慕尼黑鲁珀特迈耶大街 任务是将DF中的所有城市映射到其英文名称,但是,由于城市的格式和语言不同,我发现除了手动执行此任务

我有一组大约15k的观测数据。这是来自世界各地的城市名称。这个数据集由来自许多不同国家的人填充,这意味着我有几个相同城市的不同语言的副本。见下文DF摘录:

城市名称
布鲁塞拉斯
布鲁塞尔
布鲁塞尔
布鲁塞尔
布鲁塞尔奥德格姆酒店 布鲁塞尔 比利时布鲁塞尔酒店 门兴 蒙钦斯坦 蒙奇维伦 蒙德金根 蒙多尔谢姆 蒙吉亚 蒙古亚 慕尼黑 慕尼黑
慕尼黑
德国慕尼黑 慕尼黑慕尼黑慕尼黑 慕尼黑鲁珀特迈耶大街

任务是将DF中的所有城市映射到其英文名称,但是,由于城市的格式和语言不同,我发现除了手动执行此任务之外,很难找到解决方案,因为我们有15000多个观察结果要进行,这是没有成效的。最终的数据集应该是这样的(仅使用上面的一些观察结果):

城市名称映射城市
布鲁塞尔奥德格姆布鲁塞尔斯酒店
布鲁塞勒斯布鲁塞尔斯酒店
比利时布鲁塞尔酒店
慕尼黑慕尼黑慕尼黑
慕尼黑德国慕尼黑


如果有任何帮助,我们将不胜感激。

请尝试使用模糊Wuzzy(使用

我们需要一个城市的主列表来用作查找,我假设您知道这些城市是什么,我将使用github中的这个

cities = pd.read_csv('https://datahub.io/core/world-cities/r/0.csv')

choices = df['City Names'].to_dict()
lookups = cities['name'].tolist()


res = [(lookup,) + item for lookup in lookups for item in process.extract(lookup, choices,limit=2)]
df = pd.DataFrame(res, columns=["lookup", "matched", "score", "idx"])

print(df)
  lookup    matched  score  idx
9401     Munich     munich    100   13
12612    Mungia     mungia    100   10
9400     Munich     munich    100   12
1820   Brussels   brussels    100    0
12613    Mungia    munguia     92   11
...         ...        ...    ...  ...
27205    Желино  auderghem      0    1
27204    Желино   brussels      0    0
27487   Зуунмод  auderghem      0    1
27486   Зуунмод   brussels      0    0
27212    Теарце   brussels      0    0
当然,如果您事先编辑查找数据框,只保留您知道的城市在列表中,那么这将使查找运行更快,并返回您需要的结果

例如

lookups = ['brussels','munich']

print(df.sort_values('score',ascending=False))
     lookup    matched  score  idx
0  brussels   brussels    100    0
2    munich     munich    100   12
3    munich     munich    100   13
1  brussels  bruxelles     71    2
然后,您可以进行得分最高的查找

希望这能为你指明正确的方向。我不是这个库的专家,所以最好仔细阅读您的用例文档以优化代码。
祝你好运

您可以使用谷歌地图或OpenStreetMap搜索这些地方,并查看它们返回的内容。这两种语言似乎都能处理不同语言的查询(例如,慕尼黑/慕尼黑、北京/北京),有无国家,以及一些拼写错误(例如,没有“ü”的“munchen”)

好吧,Google Maps API不是免费使用的,但是OSM API应该是免费的,而且在任何情况下,您都可以向两者发出GET请求并解析结果。例如,对于OpenStreetMap:

import requests, re, json

lst = {'bruxelles', 'munguia', 'munich rupert mayer strasse', 'munchen', 
       'mundolsheim', 'munchenstein', 'munich', 'brussels', 'munich  germany', 
       'bruselas', 'brussels  auderghem ', 'munderkingen', 'mungia', 
       'munchwilen', 'bruxelles belgium', 'munich  munchen ', 'brussel'}

query = "https://nominatim.openstreetmap.org/search.php?q=%s"
for x in lst:
    response = requests.get(query % x)
    matches = re.findall(r'"placename": (".*?"),', response.text)
    print(x, "-->", json.loads(matches[0]))
结果并不完美,例如,有些结果有点过于具体,但您可以使用其他属性,例如“类型”(可能应该是“城市”)。通过一些清理和修补,这应该可以让你开始了

munich --> München
munderkingen --> Munderkingen
munich  munchen  --> Johanniter-Unfall-Hilfe e.V., Regionalgeschäftsstelle
mungia --> Mungia
brussels  auderghem  --> Auderghem - Oudergem
munchwilen --> Münchwilen
bruselas --> Bruxelles / Brussel
bruxelles --> Bruxelles / Brussel
munguia --> Mungia
munich rupert mayer strasse --> Rupert-Mayer-Straße
mundolsheim --> Mundolsheim
bruxelles belgium --> Bruxelles / Brussel
munchen --> München
brussels --> Bruxelles / Brussel
munchenstein --> Münchenstein
munich  germany --> München
brussel --> Bruxelles / Brussel
谷歌地图(GoogleMaps)也应该有同样的要求,但结果似乎不像OSM那样容易解析


(免责声明:如果你向他们发送15k这样的请求,不确定他们是否太兴奋,你可能希望将这些请求分散一点,或者使用比HTTP请求更正式的API。你绝对应该缓存这两个完整搜索查询的结果(在不再次查询的情况下调整要使用的属性)如果是重复的用户指定城市,则映射城市以减少请求数量,从而减少服务器负载和您的运行时间。)

只是一个想法:转到wikipedia并抓取“以其他语言阅读”链接?毫不奇怪,谷歌地图也非常擅长用不同的语言识别城市名称(包括带或不带国家/地区和拼写错误)。不过,我会用双s来映射布鲁塞尔。另一种方法是获取所有城市的列表,并将其所有翻译映射到英语。然后你可以合并或映射到英语等价物They Seci,我知道当你不能留下评论时这很难,但是这样的答案几乎没有用处,为什么不发布一个例子,用一些代码来帮助其他人呢?很好,这将笛福派上用场感谢编辑作为well@tobias_k这个解决方案似乎有效,但当我输入我的整个城市列表时,我得到了一个错误
索引器:列表索引超出范围
,我不知道为什么,因为我们没有调用一个特定的索引,如果这样做有意义的话?@RaulGonzales,我想应该在这里:
json.loads(匹配[0])
可能有一个查询根本不会产生任何结果。通常,在实践中,您可能不应该只获取第一个结果,还应该查看其他属性,例如类型(无论是城市还是餐馆)@datanovice谢谢,但不幸的是,随着城市数量的增加,代码需要更长的时间才能运行,然后崩溃。我整个周末都在运行,昨天晚上就崩溃了。@RaulGonzales我想如果您使用城市数据集,可能会出现这种情况,您是否使用了自己的查找表?
munich --> München
munderkingen --> Munderkingen
munich  munchen  --> Johanniter-Unfall-Hilfe e.V., Regionalgeschäftsstelle
mungia --> Mungia
brussels  auderghem  --> Auderghem - Oudergem
munchwilen --> Münchwilen
bruselas --> Bruxelles / Brussel
bruxelles --> Bruxelles / Brussel
munguia --> Mungia
munich rupert mayer strasse --> Rupert-Mayer-Straße
mundolsheim --> Mundolsheim
bruxelles belgium --> Bruxelles / Brussel
munchen --> München
brussels --> Bruxelles / Brussel
munchenstein --> Münchenstein
munich  germany --> München
brussel --> Bruxelles / Brussel