"never seen before" 个字符的 Geopandas 编码
Geopandas encodings for "never seen before" characters
在这些天里,我一直在努力处理我使用 geopandas 管理的地理数据框。我的问题来自属于地区和城镇名称的特殊字符的奇怪格式。我从未见过我面前的格式。幸运的是,他们并不多。
我尝试 select 所有类型的编码,从 latin-1 到几个 ISO-xxx,但唯一能正常工作的方法是用字典手动替换(我不喜欢它,因为它只是构建的使用我可以从数据框本身获取的示例。如果将来它确实发生了变化,它会忽略它)。
这是我如何处理替换的示例。由于我找不到任何好的编码可以让我正确读取数据帧,我将 'utf-8' 编码作为 geopandas opener 的参数。
df1 = gpd.read_file('path/to/my/file.shp', encoding='utf-8')
反正得到的结果和例子中插入的一样。为了这个例子,我只放了 2 个实例,除了在我的原始数据框中,字典中的每一对至少有一个。
df = pd.DataFrame([[b"Pr\x8e-Saint-Didier", b"Vall\x8e d'Aoste"],[ "Bozen", b"Trentino Alto Adige - S\x9ddtirol"]], columns = ['town', 'region'])
special_chars = {
'\x9f':'ü',
'\x93':'ì',
'\xed':'ì',
'\x8e':'é',
'\x8f':'è',
'\x8d':'ç',
'\x90':'ê',
'\x98':'ò',
'\x9d':'ù',
'\x88':'à',
}
df['town'] = df['town'].str.decode('latin-1').replace(special_chars, regex=True)
df['region'] = df['region'].str.decode('latin-1').replace(special_chars, regex=True)
有人知道如何解决这个问题吗?
如何处理?
可能它是一个现有的编码,所以你有几种可能性:在维基百科中检查几个这样的字符。一些重音字符有一个可能的编码列表。在这种情况下,我发现旧的 MacOS 代码页中有一些字符是正确的。所以我检查了其他 Mac 编码,我想我找到了。
或者(如果您有许多不同的文件和编码,则执行此操作):您可以编写一个带有短转换 table 的 Python 脚本,然后迭代所有编码。 Select 具有更好点的 3 种编码(并且可能还会打印此类编码中的字符)。这在第一次尝试时会更长,但如果你经常遇到这样的问题,它会对你有所帮助(特别是因为看起来你正在处理旧数据)。
注意:看来你猜错的可能很少(wrong case?)。
我发现了什么?
我认为是Mac OS Roman。或者可能是一些相关的 Mac_OS 编码。现在你的任务是仔细检查我的猜测是否正确(我没有检查所有字符)。
注意:此编码在 Python 中称为 mac_roman
。
在这些天里,我一直在努力处理我使用 geopandas 管理的地理数据框。我的问题来自属于地区和城镇名称的特殊字符的奇怪格式。我从未见过我面前的格式。幸运的是,他们并不多。 我尝试 select 所有类型的编码,从 latin-1 到几个 ISO-xxx,但唯一能正常工作的方法是用字典手动替换(我不喜欢它,因为它只是构建的使用我可以从数据框本身获取的示例。如果将来它确实发生了变化,它会忽略它)。
这是我如何处理替换的示例。由于我找不到任何好的编码可以让我正确读取数据帧,我将 'utf-8' 编码作为 geopandas opener 的参数。
df1 = gpd.read_file('path/to/my/file.shp', encoding='utf-8')
反正得到的结果和例子中插入的一样。为了这个例子,我只放了 2 个实例,除了在我的原始数据框中,字典中的每一对至少有一个。
df = pd.DataFrame([[b"Pr\x8e-Saint-Didier", b"Vall\x8e d'Aoste"],[ "Bozen", b"Trentino Alto Adige - S\x9ddtirol"]], columns = ['town', 'region'])
special_chars = {
'\x9f':'ü',
'\x93':'ì',
'\xed':'ì',
'\x8e':'é',
'\x8f':'è',
'\x8d':'ç',
'\x90':'ê',
'\x98':'ò',
'\x9d':'ù',
'\x88':'à',
}
df['town'] = df['town'].str.decode('latin-1').replace(special_chars, regex=True)
df['region'] = df['region'].str.decode('latin-1').replace(special_chars, regex=True)
有人知道如何解决这个问题吗?
如何处理?
可能它是一个现有的编码,所以你有几种可能性:在维基百科中检查几个这样的字符。一些重音字符有一个可能的编码列表。在这种情况下,我发现旧的 MacOS 代码页中有一些字符是正确的。所以我检查了其他 Mac 编码,我想我找到了。
或者(如果您有许多不同的文件和编码,则执行此操作):您可以编写一个带有短转换 table 的 Python 脚本,然后迭代所有编码。 Select 具有更好点的 3 种编码(并且可能还会打印此类编码中的字符)。这在第一次尝试时会更长,但如果你经常遇到这样的问题,它会对你有所帮助(特别是因为看起来你正在处理旧数据)。
注意:看来你猜错的可能很少(wrong case?)。
我发现了什么?
我认为是Mac OS Roman。或者可能是一些相关的 Mac_OS 编码。现在你的任务是仔细检查我的猜测是否正确(我没有检查所有字符)。
注意:此编码在 Python 中称为 mac_roman
。