You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 03:20:02