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
相关产品推荐
相关产品推荐

