如何在PySpark中替换带重音符号的字符?

3

我在一个数据框中有一个字符串列,其中的值带有重音符号,例如

'México', 'Albânia', 'Japão'

如何将带有重音的字母替换为以下内容:
'Mexico', 'Albania', 'Japao'

我尝试了Stack OverFlow上提供的很多解决方案,例如这个:

def strip_accents(s):
   return ''.join(c for c in unicodedata.normalize('NFD', s)
                  if unicodedata.category(c) != 'Mn')

但是令人失望的回报
strip_accents('México')
>>> 'M?xico'

请看这里。https://dev59.com/qHA75IYBdhLWcg3wYYBQ - Shavk with a Hoon
2个回答

3
你可以使用 translate:
df = spark.createDataFrame(
    [
    ('1','Japão'),
    ('2','Irã'),
    ('3','São Paulo'),
    ('5','Canadá'),
    ('6','Tókio'),
    ('7','México'),
    ('8','Albânia')
    ],
    ["id", "Local"]
)

df.show(truncate = False)

+---+---------+
|id |Local    |
+---+---------+
|1  |Japão    |
|2  |Irã      |
|3  |São Paulo|
|5  |Canadá   |
|6  |Tókio    |
|7  |México   |
|8  |Albânia  |
+---+---------+

from pyspark.sql import functions as F

df\
    .withColumn('Loc_norm', F.translate('Local',
                                       'ãäöüẞáäčďéěíĺľňóôŕšťúůýžÄÖÜẞÁÄČĎÉĚÍĹĽŇÓÔŔŠŤÚŮÝŽ',
                                       'aaousaacdeeillnoorstuuyzAOUSAACDEEILLNOORSTUUYZ'))\
    .show(truncate=False)

+---+---------+---------+
|id |Local    |Loc_norm |
+---+---------+---------+
|1  |Japão    |Japao    |
|2  |Irã      |Ira      |
|3  |São Paulo|Sao Paulo|
|5  |Canadá   |Canada   |
|6  |Tókio    |Tokio    |
|7  |México   |Mexico   |
|8  |Albânia  |Albânia  |
+---+---------+---------+


这个可以做!但是把字母e替换成a,比如说Mexico变成Maxico,哈哈。不过,我觉得我的问题可能出在AWS集群的配置上。 - Ana Beatriz
可能你的文件编码不是UTF-8。 - Luiz Viola
为什么阿尔巴尼亚继续使用重音符号? - Vivian
似乎â不在列表中... - Luiz Viola
我喜欢这个解决方案。 - JAGJ jdfoxito

0
在PySpark中,你可以创建一个向量化的pandas_udf,因此它比常规的udf更受欢迎。 似乎是在pandas中完成此操作的最佳方法。因此,我们可以使用它来为PySpark应用程序创建一个pandas_udf
from pyspark.sql import functions as F
import pandas as pd

@F.pandas_udf('string')
def strip_accents(s: pd.Series) -> pd.Series:
    return s.str.normalize('NFKD').str.encode('ascii', 'ignore').str.decode('utf-8')

测试:
df = spark.createDataFrame([('México',), ('Albânia',), ('Japão',)], ['country'])

df = df.withColumn('country2', strip_accents('country'))

df.show()
# +-------+--------+
# |country|country2|
# +-------+--------+
# | México|  Mexico|
# |Albânia| Albania|
# |  Japão|   Japao|
# +-------+--------+

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接