Pandas中Series名称与列名冲突引发报错的解决方法咨询
解决Pandas中apply函数行Series的name属性与列名冲突问题
错误原因
你遇到的'int' object is not subscriptable错误,核心是行Series的name属性和DataFrame的name列重名导致的歧义:
当用apply(axis="columns")时,传入函数的row是行级Series,这个Series的name属性默认存储的是行的索引值(比如0、1这类整数);而你想访问的是DataFrame中名为name的列,但用row.name时,实际拿到的是行索引的整数,自然不能用[0]下标访问,所以报错。
解决方法
方法1:用方括号索引明确指定列名
直接通过row['列名']的方式访问,彻底避免属性访问的歧义,这是最直接的修复方式:
def get_bonus(row): # 补上if语句的冒号,用row['name']替代row.name if (row['name'][0] == "M") and (row['employee_id'] % 2 == 0): return row['salary'] else: return 0 def calculate_special_bonus(employees: pd.DataFrame) -> pd.DataFrame: employees["bonus"] = employees.apply(get_bonus, axis="columns") return employees[["employee_id", "bonus"]]
方法2:重命名易冲突的列名
如果习惯用属性访问(row.列名),可以提前修改DataFrame的列名,避免和行Series的内置属性(比如name、index)重名:
# 先把name列重命名为employee_name employees = employees.rename(columns={'name': 'employee_name'}) def get_bonus(row): if (row.employee_name[0] == "M") and (row.employee_id % 2 == 0): return row.salary else: return 0 def calculate_special_bonus(employees: pd.DataFrame) -> pd.DataFrame: employees["bonus"] = employees.apply(get_bonus, axis="columns") return employees[["employee_id", "bonus"]]
方法3:用向量化操作替代apply(推荐)
LeetCode的Pandas题目中,apply效率较低,且容易引发这类属性冲突问题。用Pandas的向量化方法处理更高效简洁:
import numpy as np def calculate_special_bonus(employees: pd.DataFrame) -> pd.DataFrame: # 用str.startswith判断名字首字母,结合np.where生成bonus列 employees['bonus'] = np.where( (employees['name'].str.startswith('M')) & (employees['employee_id'] % 2 == 0), employees['salary'], 0 ) return employees[["employee_id", "bonus"]]
额外注意
原代码中if语句末尾缺少冒号,这也是语法错误,修复时需要补上。
内容的提问来源于stack exchange,提问作者YYY
相关产品推荐
相关产品推荐

