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字符,再基于这个结果排序。
步骤示例:
- 先安装库:
pip install unidecode
- 编写排序代码:
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
相关产品推荐
相关产品推荐

