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

Pandas DataFrame按字母排序失效问题求助

解决DataFrame按字符串列不区分大小写排序的问题

我太懂你这6小时的困扰了!你遇到的核心问题是字符串排序默认区分大小写——Python和pandas里的字符串排序是基于Unicode码点的,大写字母的码点比小写字母小,比如London(首字母大写)的码点会比garden(首字母小写)小,所以会排在前面,这就导致排序结果不符合你预期的字母顺序,看起来像是“失效”了。

解决方案:实现不区分大小写的字母排序

这里给你两种可行的方法,推荐第一种更简洁的方案:

方法1:使用sort_values的key参数(pandas 1.1.0及以上版本支持)

直接在排序时指定处理函数,把字符串统一转成小写后再排序,就能实现不区分大小写的自然字母排序:

import pandas as pd

dict_table = {'2 bedroom flat in London': 3515, '2 bedroom flat in london': 3515, 'Dalton': 188, 'Lincolnshire': 796, 'London': 3515, 'Yorkshire': 0, 'garden': 566, 'greenwich': 1740, 'london': 3515}
df = pd.DataFrame(dict_table.items())
df.columns = ['Search query', 'No of search results']
df.index +=1

# 执行不区分大小写的排序
df = df.sort_values('Search query', key=lambda x: x.str.lower())
print(df)

运行后会得到符合预期的排序结果:

Search query  No of search results
1  2 bedroom flat in London                  3515
2  2 bedroom flat in london                  3515
3                  Dalton                   188
7                  garden                   566
8               greenwich                  1740
4             Lincolnshire                   796
5                  London                  3515
9                  london                  3515
6               Yorkshire                     0

方法2:创建临时小写辅助列(兼容旧版pandas)

如果你用的pandas版本低于1.1.0,可以先生成一个小写的临时列,排序完成后再删除它:

# 添加临时小写列
df['lowercase_query'] = df['Search query'].str.lower()
# 按临时列排序
df = df.sort_values('lowercase_query')
# 删除临时列
df = df.drop('lowercase_query', axis=1)

为什么原来的排序看起来“异常”?

默认的sort_values('Search query')是按字符串的原始Unicode码点排序的:

  • 数字2的码点比所有字母都小,所以带数字的字符串会排在最前面
  • 大写字母的码点小于小写字母,比如L(76)< g(103),所以London会排在garden前面

这种排序逻辑符合程序的默认规则,但不符合我们日常认知的字母顺序,所以才会让你觉得排序“失效”了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 12:02:49