代码之家  ›  专栏  ›  技术社区  ›  Bao Thai

使用pandas数据帧在python中将utf转换为ascii

  •  8
  • Bao Thai  · 技术社区  · 6 年前

    我正在尝试将unicode字的DataFrame中的数据转换为ASCII,并将其转换为具有特定字符更改的新列。。。

    characterMap = {u'\u00E7': 'c', u'\u00C7' : 'C', u'\u011F' : 'g', u'\u011E' : 'G', u'\u00F6': 'o', u'\u00D6' : 'O', u'\u015F' : 's', u'\u015E' : 'S', u'\u00FC' : 'u', u'\u00DC' : 'U' , u'\u0131' : 'i', u'\u0049' : 'I', u'\u0259' : 'e', u'\u018F' : 'E'}
    
    def convertASCII(word):
        asciiWord = ""
        word = str(word).rstrip()
        for c in word:
            if c in characterMap.keys():
                asciiWord = asciiWord + characterMap[c]
            else:
                asciiWord = asciiWord + c
        return asciiWord;
    
    test['ascii'] = test['token'].apply(convertASCII)
    

    所以说结果应该是这样的。。。

                   token         ascii
    1555757    qurbangaha    qurbangaha
    379221          saylı         sayli
    2456599      öhdəliyi      ohdeliyi
    1128903            ki            ki
    467997         ilişib        ilisib
    

    然而,ASCII列只是令牌列的重复,而不是上面所期望的结果?我已经在另一个脚本上手动运行了convertASCII代码,它实现了我想要的功能,但不确定pandas的错误是什么?

    2 回复  |  直到 6 年前
        1
  •  10
  •   Vikash Singh    6 年前

    如果您尝试进行的unicode转换是标准的,那么您可以直接转换为ascii。

    import unicodedata
    
    test['ascii'] = test['token'].apply(lambda val: unicodedata.normalize('NFKD', val).encode('ascii', 'ignore').decode())
    

    例子:

    import unicodedata
    data = [{'name': 'saylı'}, {'name': 'öhdəliyi'}]
    df = pd.DataFrame.from_dict(data, orient='columns')
    df['name'].apply(lambda val: unicodedata.normalize('NFKD', val).encode('ascii', 'ignore').decode())
    

    输出:

    0       sayl
    1    ohdliyi
    
        2
  •  2
  •   jezrael    6 年前

    我相信需要 str.normalize ,但首先需要 replace 通过 dictionary 为避免丢失字符:

    test = pd.DataFrame({'token':['qurbangaha','saylı','öhdəliyi','ki','ilişib']})
    print (test)
            token
    0  qurbangaha
    1       saylı
    2    öhdəliyi
    3          ki
    4      ilişib
    
    characterMap = {u'\u00E7': 'c', u'\u00C7' : 'C', u'\u011F' : 'g', u'\u011E' : 'G', u'\u00F6': 'o', u'\u00D6' : 'O', u'\u015F' : 's', u'\u015E' : 'S', u'\u00FC' : 'u', u'\u00DC' : 'U' , u'\u0131' : 'i', u'\u0049' : 'I', u'\u0259' : 'e', u'\u018F' : 'E'}
    
    test['ascii'] = (test['token'].astype("str")
                                  .str.rstrip()
                                  .replace(characterMap, regex=True)
                                  .str.normalize('NFKD')
                                  .str.encode('ascii', errors='ignore')
                                  .str.decode('utf-8'))
    
    print (test)
            token       ascii
    0  qurbangaha  qurbangaha
    1       saylı       sayli
    2    öhdəliyi    ohdeliyi
    3          ki          ki
    4      ilişib      ilisib
    

    如果在中定义了所有可能的值 词典 ,解决方案应简化:

    test['ascii'] = (test['token'].astype("str")
                                  .str.rstrip()
                                  .replace(characterMap, regex=True))
    
    print (test)
            token       ascii
    0  qurbangaha  qurbangaha
    1       saylı       sayli
    2    öhdəliyi    ohdeliyi
    3          ki          ki
    4      ilişib      ilisib