我有大约15,000个观测值的数据集。该观察结果是来自世界各地的城市名称。这个数据集已经被来自许多不同国家的人们所填充,这意味着我用相同的语言用相同的语言重复了几个城市。参见以下DF摘录:
city_name
bruselas
brussel
brussels
brussels
brussels auderghem
bruxelles
bruxelles belgium
munchen
munchenstein
munchwilen
munderkingen
mundolsheim
mungia
munguia
munich
munich
munich
munich germany
munich munchen
munich rupert mayer strasse
任务是将DF中的所有城市都映射到其英文名称,但是,因为这些城市的格式和语言不同,所以我发现很难找到一种解决方案,除了手动执行此任务外,这不是我们要进行15,000多个观察,因此具有很高的生产力。最终数据集应如下所示(仅使用上面的一些观察结果):
city_name mapped_city
brussels auderghem Brusels
bruxelles Brusels
bruxelles belgium Brusels
munchen Munich
munich germany Munich
任何帮助将不胜感激
使用使用Levenshtein distance algorithm的模糊模糊
import pandas as pd
from fuzzywuzzy import process, fuzz
df = pd.read_clipboard(sep='\t')
print(df.head(5))
0 brussels
1 auderghem
2 bruxelles
3 bruxelles
4 belgium
我们需要一个城市的主列表来用作查找,我假设您知道城市是什么,我将使用来自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
自然,如果您事先编辑查找数据框以仅将您知道的城市保留在列表中,那么这将使查找运行更快并返回所需的结果。
例如,e]
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
然后您可以以最高分进行查找。
希望这会为您指明正确的方向。我不是这个库的专家,所以最好仔细阅读您的用例文档以优化代码。祝你好运。
您可以只使用Google Maps或OpenStreetMap来搜索那些地方并查看它们返回的内容。两者似乎都能处理带有或不带有国家/地区的不同语言(例如慕尼黑/慕尼黑,北京/北京)的查询,以及一些拼写错误(例如不带“ü”的“ munchen”)。