pandas根据独立分类列表排序DataFrame的方法及报错解决
错误原因
你的代码存在两个问题,导致无法正常排序:
pd.DataFrame.sort_values()接收的排序参数必须是当前DataFrame的列名,或者和DataFrame长度一致、索引对齐的排序键。你传入的mtg_sets_order是长度627的独立分类变量,和你创建的长度为7的test DataFrame完全不匹配,也不属于test的列,必然触发报错。- 你创建的test DataFrame中存储集合名的列是普通字符串类型,没有绑定你预先定义好的分类排序规则,pandas不会自动关联外部定义的分类变量做排序。
正确实现代码
你只需要先把待排序的列转换成绑定了预设顺序的有序分类类型,再调用排序方法即可:
# 先从已有的有序分类变量中提取预设的排序顺序列表 set_sort_order = mtg_sets_order.categories.tolist() # 构造测试数据集时给排序列起明确的列名,避免默认列名带来的混淆 test = ['Limited Edition Alpha', 'Unfinity', 'Game Night 2022', 'Limited Edition Beta', 'Unlimited Edition', 'Dominaria United', 'Collectors’ Edition'] test = pd.DataFrame(test, columns=['mtg_set']) # 将待排序列转换为绑定了预设顺序的有序分类类型 test['mtg_set'] = pd.Categorical( test['mtg_set'], categories=set_sort_order, ordered=True ) # 按分类列排序,重置索引避免保留原索引顺序 sorted_test = test.sort_values('mtg_set').reset_index(drop=True)
注意事项
- 如果待排序数据中存在
mtg_sets_order里没有收录的集合名称,转换分类类型时这部分值会被标记为缺失值NaN,默认会被排到结果末尾,你可以根据需求提前过滤这部分异常值,或者调整缺失值排序规则。 - 不要直接将外部独立的序列对象传入
sort_values作为排序键,除非你100%确认它的长度、索引和待排序DataFrame完全对齐,否则会出现排序结果错乱、长度不匹配报错等问题。
内容的提问来源于stack exchange,提问作者Roughmar
相关产品推荐
相关产品推荐

