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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 19:40:23