Python如何使用变量作为对象属性名实现动态属性访问
问题描述
我尝试运行如下代码:
def find_unknown_val(field, value, unknown_val): temp_df = get_frame(field, value) return temp_df.iloc[0].str(unknown_val) print(find_unknown_val('Member_Name','McCarron,John','Supervisor_Name'))
运行后抛出错误:TypeError: 'StringMethods' object is not callable,但使用硬编码属性名的代码时可正常运行:
def find_unknown_val(field, value, unknown_val): temp_df = get_frame(field, value) return temp_df.iloc[0].Supervisor_Name
需要实现传入变量作为对象属性名,动态访问对应属性值的效果。
错误原因
.str是pandas Series提供的字符串处理方法集合入口,本身是StringMethods类型的实例,不是用来按名称取列值的接口,不能作为函数调用传入列名,因此触发类型错误。
实现方案
两种写法都可以实现动态按变量名取值的需求:
- 优先使用pandas原生方括号索引,这是官方推荐的动态取列方式,兼容性最强,不会受列名特殊字符、重名问题影响:
def find_unknown_val(field, value, unknown_val): temp_df = get_frame(field, value) return temp_df.iloc[0][unknown_val]
- 如果要走原生属性访问逻辑,可以用Python内置
getattr函数动态获取属性:
def find_unknown_val(field, value, unknown_val): temp_df = get_frame(field, value) return getattr(temp_df.iloc[0], unknown_val)
提示:如果列名包含空格、运算符,或者和Series/Index的内置属性、方法重名,
getattr写法会出现异常,日常用pandas处理数据优先选方括号索引的写法。
内容的提问来源于stack exchange,提问作者Zack Paquette
相关产品推荐
相关产品推荐

