You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何对包含重音字符的DataFrame进行排序?

解决Pandas DataFrame中带重音UTF-8字符的排序问题

这个问题我之前处理过好几次!默认情况下sort_values是按Unicode码点排序的,所以像é这种带重音的字符,因为它的码点比i高,就会跑到末尾去,而不是跟在e后面。不管你的DataFrame是单列还是多列,都可以用下面两种方法实现符合直觉的字典序排序(忽略重音,把é排在e之后):

方法一:利用系统Locale实现本地化排序

这种方法会遵循当地语言的排序规则(比如法语中重音字符的排序逻辑),但需要系统支持对应的语言环境。

步骤示例:

import pandas as pd
import locale

# 注意:不同系统的Locale名称不一样
# Linux/macOS 一般用 'fr_FR.UTF-8'(以法语为例,支持重音排序)
# Windows 则用 'French_France.1252'
locale.setlocale(locale.LC_COLLATE, 'fr_FR.UTF-8')

# 构造你的多列DataFrame
df = pd.DataFrame({
    'col1': ['i', 'e', 'a', 'é'],
    'col2': ['z', 'y', 'x', 'è']
})

# 单列排序:按col1排序,用locale的规则处理字符串
sorted_single_col = df.sort_values(by='col1', key=lambda x: x.apply(locale.strxfrm))
print(sorted_single_col)

# 多列排序:先按col1,再按col2,同样应用locale规则
sorted_multi_col = df.sort_values(by=['col1', 'col2'], key=lambda x: x.apply(locale.strxfrm))
print(sorted_multi_col)

方法二:用Unidecode库移除重音后排序(跨平台通用)

如果不想依赖系统Locale,或者需要跨平台兼容,unidecode库是个好选择——它能把带重音的UTF-8字符转成对应的无重音ASCII字符,再基于这个结果排序。

步骤示例:

  1. 先安装库:
pip install unidecode
  1. 编写排序代码:
import pandas as pd
from unidecode import unidecode

# 多列示例DataFrame
df = pd.DataFrame({
    'col1': ['i', 'e', 'a', 'é'],
    'col2': ['z', 'y', 'x', 'è']
})

# 单列排序:把col1的字符转成无重音版本作为排序依据
sorted_single_col = df.sort_values(by='col1', key=lambda x: x.apply(unidecode))
print(sorted_single_col)

# 多列排序:对每一列都应用去重音处理
sorted_multi_col = df.sort_values(by=['col1', 'col2'], key=lambda x: x.apply(unidecode))
print(sorted_multi_col)

旧版本Pandas兼容方案

如果你的Pandas版本低于1.1.0(key参数是1.1.0才加入的),可以先创建辅助列(存储去重音后的字符串),排序后再删掉辅助列:

df['col1_clean'] = df['col1'].apply(unidecode)
df['col2_clean'] = df['col2'].apply(unidecode)

# 按辅助列排序
sorted_df = df.sort_values(by=['col1_clean', 'col2_clean'])

# 移除辅助列
sorted_df = sorted_df.drop(['col1_clean', 'col2_clean'], axis=1)
print(sorted_df)

内容的提问来源于stack exchange,提问作者Fifi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:58:07