Python Pandas自定义排序CSV数据集时遇TypeError问题求助
自定义排序CSV数据集问题
原始数据集
Name Style ID 0 heels High end 1 1 sneaker Middle 0 2 top High end 3 3 skirt Low end 6 4 dress High end 4 5 sweater Low end 9 6 hat N/A. 2 ..
需求描述
需要按自定义规则排序数据集:优先排列High end、Middle、Low end类型,其余类型后置,目标排序结果如下:
Name Style ID 0 heels High end 1 1 top High end 3 2 dress High end 4 3 sneaker Middle 0 4 skirt Low end 6 5 sweater Low end 9 6 hat N/A. 2 ...
尝试的代码及错误
第一次尝试
sort_order = {'High End':0, 'Middle':1, 'Low end':2,} Clothing_Df['Style'].apply(lambda x: sort_order[x])
触发错误:
TypeError: list indices must be integers or slices, not str
第二次尝试
sortlist = ['High End':0, 'Middle':1, 'Low end':2,] sorted(Clothing_Df['Style'], key= sortlist)
同样触发上述TypeError。
解决方案
问题分析
- 第一个错误核心:字典键
High End与数据集中的High end大小写不匹配,且遇到不在字典中的值(如N/A.)会直接报错;另外代码未完成排序逻辑,仅生成排序键。 - 第二个错误核心:
['High End':0,...]是非法语法(列表不能用键值对),且sorted的key参数需要传入函数,不能直接传字典。
正确实现代码
方法一:字典映射+临时排序键(通用兼容)
# 确保键名与数据集中的Style值完全匹配 sort_order = {'High end': 0, 'Middle': 1, 'Low end': 2} # 给不在规则内的类型分配大数值,使其排在最后 Clothing_Df['sort_key'] = Clothing_Df['Style'].map(lambda x: sort_order.get(x, 3)) # 按临时键排序后删除该列 sorted_df = Clothing_Df.sort_values('sort_key').drop('sort_key', axis=1)
方法二:分类数据类型(大数据集高效首选)
import pandas as pd # 定义自定义排序的分类顺序 custom_order = ['High end', 'Middle', 'Low end'] # 将Style列转为分类类型,指定顺序并标记为有序 Clothing_Df['Style'] = pd.Categorical(Clothing_Df['Style'], categories=custom_order, ordered=True) # 直接按Style列排序 sorted_df = Clothing_Df.sort_values('Style')
该方法无需创建临时列,分类类型的排序效率远高于普通字符串排序,适合大规模数据集。
关键注意事项
- 必须保证分类规则中的字符串与数据集中的
Style值完全一致(包括大小写、空格、标点)。 - 若存在多种"其余类型",
pd.Categorical会自动将所有不在categories内的值统一排在最后,无需额外处理。
内容的提问来源于stack exchange,提问作者DataandCodes
相关产品推荐
相关产品推荐

