在 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 中,如何对包含重音符号的数据框进行排序?的主要内容,如果未能解决你的问题,请参考以下文章
如何解码 base64 字符串并获取正确的字符,包括重音符号?
MySQL 表中带有重音符号的字符串在 R (RODBC) 中返回为 NA