如何将字符串类型列名变量传入pandas自定义函数解决属性报错
问题根因
报错的核心原因是函数内的写法错误:dataframe.column_name是固定访问DataFrame中名称**字面量为column_name**的列,不会解析你传入的column_name参数存储的字符串值。你调用函数时虽然传了'CITY'作为列名参数,但代码根本没有使用这个参数值检索对应列,自然会触发找不到属性的错误。
你之前尝试改用方括号索引没解决问题,大概率是只修改了函数外的调用代码,没有替换函数内部的属性访问写法。
另外原代码里用dict作为变量名是不好的习惯,会覆盖Python内置的字典类型,容易埋下隐性bug。
正确实现
函数内部访问动态列名必须使用方括号索引语法,把存储列名的参数传入索引位,同时可以简化序号生成的逻辑:
def make_dict(dataframe, column_name): keys = dataframe[column_name].unique() keys.sort() # 用enumerate直接遍历拿到序号和对应取值,无需单独生成值列表 col_map = {key: idx for idx, key in enumerate(keys)} return col_map
调用方式和你之前写的完全一致,直接传入DataFrame和列名字符串即可:
city_dict = make_dict(df, 'CITY')
这个实现和你最初单写STATE列映射的逻辑完全对齐:先取列的唯一值、排序后按顺序映射从0开始的连续整数。
补充:如果不需要强制对唯一值做排序,pandas自带的
pd.factorize也可以快速完成列取值到整数的映射,但如果需要保持你原有排序后编号的逻辑,上面的自定义函数是最贴合需求的写法。
内容的提问来源于stack exchange,提问作者Sharp Thwey Thit
相关产品推荐
相关产品推荐

