Python “地质标号”的地质标号编码;“从未见过”;人物

Python “地质标号”的地质标号编码;“从未见过”;人物,python,dataframe,encoding,special-characters,geopandas,Python,Dataframe,Encoding,Special Characters,Geopandas,在这几天里,我一直在与地理数据帧作斗争,我正在用geopandas管理这些数据帧。我的问题来自于属于地区和城镇名称的特殊字符的奇怪格式。我从来没有看到过我面前的格式。幸运的是,他们并不多。 我试着选择所有类型的编码,从拉丁语-1到几个ISO xxx,但唯一能正常工作的方法是用字典手动替换(我不喜欢它,因为它是用我可以从数据帧本身获得的示例构建的。如果它在将来发生变化,它将忽略这一点) 下面是一个我如何找到替代者的例子。因为我找不到任何好的编码来正确读取数据帧,所以我将“utf-8”编码作为geo

在这几天里,我一直在与地理数据帧作斗争,我正在用geopandas管理这些数据帧。我的问题来自于属于地区和城镇名称的特殊字符的奇怪格式。我从来没有看到过我面前的格式。幸运的是,他们并不多。 我试着选择所有类型的编码,从拉丁语-1到几个ISO xxx,但唯一能正常工作的方法是用字典手动替换(我不喜欢它,因为它是用我可以从数据帧本身获得的示例构建的。如果它在将来发生变化,它将忽略这一点)

下面是一个我如何找到替代者的例子。因为我找不到任何好的编码来正确读取数据帧,所以我将“utf-8”编码作为geopandas opener的一个参数

df1 = gpd.read_file('path/to/my/file.shp', encoding='utf-8')
无论如何,得到的结果与示例中插入的结果相同。为了这个例子,我只放了两个实例,在我的原始数据帧中,字典中每对至少有一个实例

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编码,我想我找到了

或者(如果您有许多不同的文件和编码,就这样做):您可以编写一个带有短转换表的Python脚本,并迭代所有编码。选择具有更好点的3种编码(也可以打印这种编码中的字符)。这在第一次尝试时需要更长的时间,但如果您经常遇到这样的问题,它将对您有所帮助(特别是因为您似乎正在处理旧数据)

注意:似乎很少有人猜测你是错的(错的情况?)

我发现了什么?

我想是的。或者一些相关的Mac_OS编码。现在,您的任务是仔细检查我的猜测是否正确(我没有检查所有字符)


注意:这种编码在Python中称为
mac\u-roman

太棒了,谢谢。麦克·罗曼确实工作了。如果你认为数据源应该是意大利语邮政服务(EUFF),在1984到2001之间使用编码,那就很有趣了,你如何定义为“旧类型的编码”。但在2000年之前,人们已经知道苹果公司将用UTF-8取代它,所以这种编码的使用寿命比通常过时的缓冲时间要短。意大利邮政局?它是否像其他四五个国家一样被认为是可靠的(因此在各种互联网商家的“请勿发送”列表中)[伊拉克、尼日利亚、阿富汗是其他服务不可靠的国家]。