【问题标题】:Convert Latin letters to its corresponding English alphabet in pandas将拉丁字母转换为熊猫中对应的英文字母
【发布时间】:2019-04-17 06:20:46
【问题描述】:

我在 pandas 中有一个数据框,其中包含餐厅名称,但问题是一些餐厅名称包含拉丁字母,例如 Cafe 中的 é,Yauatcha Pâtisserie 中的 â 都由 pandas 以不同方式编码,例如 Yauatcha Pâtisserie 由熊猫作为

Yauatcha PÃ\x83Â\x83Ã\x82Â\x83Ã\x83Â\x82Ã\x82Â\x83Ã\x83Â\x83Ã\x82Â\x82Ã\x83Â\x82Ã\x82Â\x83Ã\x83Â\x83Ã\x82Â\x83Ã\x83Â\x82Ã\x82Â\x82Ã\x83Â\x83Ã\x82Â\x82Ã\x83Â\x82Ã\x82Â\x83Ã\x83Â\x83Ã\x82Â\x83Ã\x83Â\x82Ã\x82Â\x83Ã\x83Â\x83Ã\x82Â\x82Ã\x83Â\x82Ã\x82Â\x82Ã\x83Â\x83Ã\x82Â\x83Ã\x83Â\x82Ã\x82Â\x82Ã\x83Â\x83Ã\x82Â\x82Ã\x83Â\x82Ã\x82¢tisserie

有不同类型的餐厅名称包含不同的拉丁字母,由熊猫以不同的方式编码。有什么办法可以找回拉丁字母或其等效英文字母?

您可以下载数据集here。 我尝试使用 python 的 unicode 库,但这似乎不起作用。 这是我尝试过的:

import pandas as pd
import unidecode
df = pd.read_csv(r"stod.csv", encoding='latin1')
df['name'].apply(unidecode.unidecode)

那么有什么办法可以从这个乱码中恢复拉丁字母

Yauatcha PÃ\x83Â\x83Ã\x82Â\x83Ã\x83Â\x82Ã\x82Â\x83Ã\x83Â\x83Ã\x82Â\x82Ã\x83Â\x82Ã\x82Â\x83Ã\x83Â\x83Ã\x82Â\x83Ã\x83Â\x82Ã\x82Â\x82Ã\x83Â\x83Ã\x82Â\x82Ã\x83Â\x82Ã\x82Â\x83Ã\x83Â\x83Ã\x82Â\x83Ã\x83Â\x82Ã\x82Â\x83Ã\x83Â\x83Ã\x82Â\x82Ã\x83Â\x82Ã\x82Â\x82Ã\x83Â\x83Ã\x82Â\x83Ã\x83Â\x82Ã\x82Â\x82Ã\x83Â\x83Ã\x82Â\x82Ã\x83Â\x82Ã\x82¢tisserie

注意:我尝试了所有可能的解决这个问题的建议,但没有一个对我有用。

【问题讨论】:

  • 你试过用'utf-8'作为编码吗?
  • 是的,我这样做了,但仍然让我胡言乱语
  • 我不认为那是拉丁字母。您是如何获得这些数据的?看起来就像用 BeautifulSoup 刮擦。无论哪种方式都是胡言乱语
  • 数据是从zomato网站上抓取的,网站中的餐厅名称被列为Café等
  • 那个数据集是垃圾。单个â 没有理由转换成这么长的字符串。

标签: python pandas unicode apply latin


【解决方案1】:

这是一个复数 mojibake。我可以还原它(请参阅以下脚本中的 demoji(x) 函数)。为了完整起见,moji(x) 函数展示了 mojibake 机制:

def demoji(x):
    global ii
    try:
      y = x.encode('latin-1').decode('utf-8')
      ii += 1
    except:
      y = x
      ii = -ii
    return y

def moji(x):
    return x.encode('utf-8').decode('latin-1','backslash replace')

xx = 'PÃ\x83Â\x83Ã\x82Â\x83Ã\x83Â\x82Ã\x82Â\x83Ã\x83Â\x83Ã\x82Â\x82Ã\x83Â\x82Ã\x82Â\x83Ã\x83Â\x83Ã\x82Â\x83Ã\x83Â\x82Ã\x82Â\x82Ã\x83Â\x83Ã\x82Â\x82Ã\x83Â\x82Ã\x82Â\x83Ã\x83Â\x83Ã\x82Â\x83Ã\x83Â\x82Ã\x82Â\x83Ã\x83Â\x83Ã\x82Â\x82Ã\x83Â\x82Ã\x82Â\x82Ã\x83Â\x83Ã\x82Â\x83Ã\x83Â\x82Ã\x82Â\x82Ã\x83Â\x83Ã\x82Â\x82Ã\x83Â\x82Ã\x82¢tisserie'
zz = xx

print("values xx and zz (initial): {}".format(repr(xx)))
ii = 0
while ii >= 0:
    xx = demoji(xx)

yy = xx
print("values xx and yy after {} demoji(xx) iterations: {}".format(-ii,repr(xx)))
for i in range(-ii):
    yy = moji(yy)

print("values yy and zz after {}   moji(yy) iterations are equal: {}".format(-ii, yy==zz))

结果: .\SO\55721108.py

values xx and zz (initial): 'PÃ\x83Â\x83Ã\x82Â\x83Ã\x83Â\x82Ã\x82Â\x83Ã\x83Â\x83Ã\x82Â\x82Ã\x83Â\x82Ã\x82Â\x83Ã\x83Â\x83Ã\x82Â\x83Ã\x83Â\x82Ã\x82Â\x82Ã\x83Â\x83Ã\x82Â\x82Ã\x83Â\x82Ã\x82Â\x83Ã\x83Â\x83Ã\x82Â\x83Ã\x83Â\x82Ã\x82Â\x83Ã\x83Â\x83Ã\x82Â\x82Ã\x83Â\x82Ã\x82Â\x82Ã\x83Â\x83Ã\x82Â\x83Ã\x83Â\x82Ã\x82Â\x82Ã\x83Â\x83Ã\x82Â\x82Ã\x83Â\x82Ã\x82¢tisserie'
values xx and yy after 7 demoji(xx) iterations: 'Pâtisserie'
values yy and zz after 7   moji(yy) iterations are equal: True

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 2015-03-27
    相关资源
    最近更新 更多