Python pandas按自定义字典排序列报get()无法应用于字符串错误
问题报错修复方案
问题场景说明
- 现有学校信息数据集字段:
ID、School Name、School Type、Class size、Specialization - 预定义两个自定义排序权重字典:
school_type_key、specialization_key - 目标函数逻辑:
- 入参为pandas DataFrame的列名字符串
- 提取该列所有唯一值转换为列表
- 匹配列对应的预设权重字典完成值排序
- 返回排序后的列表
- 触发报错:
Error in function: get() can't be applied to a string (python)
报错根因
通过字符串拼接生成的是字典名称对应的普通字符串值,不是内存中实际定义的字典对象。比如拼接得到的"school_type_key"只是字符串类型数据,本身没有字典的键值查询能力,给list.sort()传入这个字符串的.get方法作为排序依据,本质是调用字符串对象的get方法,和字典的get方法逻辑完全不匹配,直接触发类型错误。
修复代码
不要用字符串拼接变量名的隐式方式取对象,建立列名到权重字典的显式映射表即可,代码示例如下:
import pandas as pd # 预定义排序权重字典(可根据实际业务调整权重值) school_type_key = { "Public": 1, "Private": 2, "International": 3 } specialization_key = { "STEM": 1, "Liberal Arts": 2, "Arts": 3, "Vocational": 4 } # 显式维护列名与对应权重字典的映射关系 column_weight_mapping = { "School Type": school_type_key, "Specialization": specialization_key } def get_sorted_column_unique(df: pd.DataFrame, col_name: str) -> list: # 提取列唯一值转为列表 unique_values = df[col_name].unique().tolist() # 匹配对应列的权重字典 weight_dict = column_weight_mapping.get(col_name) # 无对应权重字典时直接返回原顺序唯一值列表 if not weight_dict: return unique_values # 按权重排序,未配置权重的值默认排到列表末尾 unique_values.sort(key=lambda val: weight_dict.get(val, float("inf"))) return unique_values # 调用测试 if __name__ == "__main__": # 测试数据集样例 sample_df = pd.DataFrame({ "ID": [1,2,3,4,5], "School Name": ["A High", "B Academy", "C College", "D School", "E Institute"], "School Type": ["Private", "Public", "International", "Public", "Private"], "Class size": [30, 25, 20, 28, 32], "Specialization": ["Arts", "STEM", "Liberal Arts", "STEM", "Vocational"] }) # 输出School Type排序结果:['Public', 'Private', 'International'] print(get_sorted_column_unique(sample_df, "School Type")) # 输出Specialization排序结果:['STEM', 'Liberal Arts', 'Arts', 'Vocational'] print(get_sorted_column_unique(sample_df, "Specialization"))
如果你一定要保留字符串拼接生成字典名的写法,可以通过全局作用域字典取对应对象:
weight_dict = globals().get(f"{col_name.lower().replace(' ', '_')}_key"),但非常不推荐这种隐式取值的写法,变量名和列名的绑定关系没有显式声明,后续只要修改列名或者变量名就会触发报错,静态检查工具也无法识别这类依赖,维护成本极高。
内容的提问来源于stack exchange,提问作者Demi
相关产品推荐
相关产品推荐

