如何让DataFrame列按以字母'l'开头的自定义顺序排序?
按自定义字母顺序对Pandas DataFrame排序(以'l'开头)
问题场景
我有下面这个DataFrame,想按自定义的字母顺序给Doc列排序,要求以字母'l'开头的条目排在最前面,而非默认的从'a'开始:
import pandas as pd data = [['C:/folder/!!file this', 15], ['C:/folder/apple', 14], ['C:/folder/Land file', 10]] df = pd.DataFrame(data, columns=['Doc', 'Size'])
想要的排序结果是这样的:
data = [['C:/folder/Land file', 10], ['C:/folder/!!file this', 15], ['C:/folder/apple', 14]] df_sorted = pd.DataFrame(data, columns=['Doc', 'Size'])
原代码问题分析
第一段代码报错
ValueError: substring not found的原因:
你自定义的alphabet里没加空格字符,但Doc列里的Land file包含空格,调用alphabet.index(c)查找空格时找不到,直接触发报错。另外,lambda函数里写x[0]是只处理第一个字符串,不是每一行的Doc值,逻辑本身就错了。第二段代码没改变顺序的原因:
sort_index是用来给DataFrame的索引排序的,不是给Doc列的值排序;而且你创建的pd.Categorical根本没和要排序的Doc列关联起来,当然不会有效果。
正确解决方案
第一步:补全自定义字符顺序表
先把Doc列里可能出现的所有字符都加到alphabet里,比如这次要补充空格:
# 把空格加到自定义顺序里,位置按需求调整 alphabet = """lmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijk !"#$%_'()*+,-./:;<=>?@[\]^&`{|}~"""
第二步:用sort_values的key参数生成正确排序键
给每个Doc字符串生成一个排序键——把字符串里每个字符在alphabet中的位置列成列表,Pandas会根据这个列表完成自定义排序:
df_sorted = df.sort_values(by='Doc', key=lambda s: [[alphabet.index(c) for c in string] for string in s])
完整可运行代码
import pandas as pd data = [['C:/folder/!!file this', 15], ['C:/folder/apple', 14], ['C:/folder/Land file', 10]] df = pd.DataFrame(data, columns=['Doc', 'Size']) # 包含所有需用到字符的自定义顺序表(已添加空格) alphabet = """lmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijk !"#$%_'()*+,-./:;<=>?@[\]^&`{|}~""" # 按自定义顺序排序 df_sorted = df.sort_values(by='Doc', key=lambda s: [[alphabet.index(c) for c in string] for string in s]) print(df_sorted)
运行后输出的结果就是你想要的:
Doc Size 2 C:/folder/Land file 10 0 C:/folder/!!file this 15 1 C:/folder/apple 14
小技巧
怕自定义顺序表漏字符的话,可以先提取Doc列里的所有唯一字符,检查有没有遗漏:
# 提取Doc列里的所有唯一字符 all_chars = set(''.join(df['Doc'])) # 对比自定义表,找出没包含的字符 missing_chars = all_chars - set(alphabet) if missing_chars: print(f"自定义顺序表缺了这些字符: {missing_chars}")
内容的提问来源于stack exchange,提问作者oymonk
相关产品推荐
相关产品推荐

