在 Python 中,如何对包含重音符号的数据框进行排序?

Posted

技术标签:

【中文标题】在 Python 中,如何对包含重音符号的数据框进行排序?【英文标题】:In Python, how to sort a dataframe containing accents? 【发布时间】:2018-10-17 11:16:44 【问题描述】:

我使用 sort_values 对数据框进行排序。数据框包含带有重音符号的 UTF-8 字符。这是一个例子:

>>> df = pd.DataFrame ( [ ['i'],['e'],['a'],['é'] ] )
>>> df.sort_values(by=[0])
   0
2  a
1  e
0  i
3  é

如您所见,带重音的“é”在末尾,而不是在没有重音的“e”之后。

请注意,真正的数据框有几列!

【问题讨论】:

我建议去掉变音符号进行排序,然后重新添加它们。 您使用的是哪个版本的 Python? 你被介绍给locale了吗? 3.5.2(默认,2017 年 11 月 23 日,16:37:01) 您能否更具体地了解变音符号和语言环境? 【参考方案1】:

这是一种方式。 @JonClements 建议的最简单的解决方案:

df = df.iloc[df[0].str.normalize('NFKD').argsort()]

另一种冗长的解决方案,规范化代码courtesy of @EdChum:

df = pd.DataFrame([['i'],['e'],['a'],['é']])

df = df.iloc[df[0].str.normalize('NFKD').argsort()]

# remove accents
df[1] = df[0].str.normalize('NFKD')\
             .str.encode('ascii', errors='ignore')\
             .str.decode('utf-8')

# sort by new column, then drop
df = df.sort_values(1, ascending=True)\
       .drop(1, axis=1)

print(df)

   0
2  a
1  e
3  é
0  i

【讨论】:

在这种情况下 - 可能是:df.iloc[df[0].str.normalize('NFKD').argsort()] 就是所需要的... 我们需要编码成ASCII吗?一旦我们这样做了,我们就不再拥有所有的 é。 @DSM,这很好,但应该先出现,eé 如您所见,带重音的“é”在末尾,而不是在没有重音的“e”之后。 - 似乎暗示它是首选在普通的 ASCII 字符之后...但是为什么在一天结束时这真的应该重要而不是仅仅“与它在一起”是另一个问题...

以上是关于在 Python 中,如何对包含重音符号的数据框进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

带有重音符号的Python转储json [重复]

如何解码 base64 字符串并获取正确的字符,包括重音符号?

MySQL 表中带有重音符号的字符串在 R (RODBC) 中返回为 NA

Spring Boot jpa 无法插入包含重音的字符串的行

R- 删除字符串中的重音符号

R-Shiny 应用程序中的重音符号