用Python绘制15000个城市地图的有效方法
我有一组大约15k的观测数据。这是来自世界各地的城市名称。这个数据集由来自许多不同国家的人填充,这意味着我有几个相同城市的不同语言的副本。见下文DF摘录:用Python绘制15000个城市地图的有效方法,python,algorithm,sorting,dataframe,Python,Algorithm,Sorting,Dataframe,我有一组大约15k的观测数据。这是来自世界各地的城市名称。这个数据集由来自许多不同国家的人填充,这意味着我有几个相同城市的不同语言的副本。见下文DF摘录: 城市名称 布鲁塞拉斯 布鲁塞尔 布鲁塞尔 布鲁塞尔 布鲁塞尔奥德格姆酒店 布鲁塞尔 比利时布鲁塞尔酒店 门兴 蒙钦斯坦 蒙奇维伦 蒙德金根 蒙多尔谢姆 蒙吉亚 蒙古亚 慕尼黑 慕尼黑 慕尼黑 德国慕尼黑 慕尼黑慕尼黑慕尼黑 慕尼黑鲁珀特迈耶大街 任务是将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