【问题标题】:In Python, how to sort a dataframe containing accents?在 Python 中,如何对包含重音符号的数据框进行排序?
【发布时间】: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)
  • 您能否更具体地了解变音符号和语言环境?

标签: python string pandas sorting dataframe


【解决方案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 字符之后...但是为什么在一天结束时这真的应该重要而不是仅仅“与它在一起”是另一个问题...
猜你喜欢
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
  • 2016-07-13
相关资源
最近更新 更多