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

使用Python DataFrame.apply基于多列计算score时出现KeyError的解决方法咨询

问题描述

我有一个结构如下的DataFrame(实际包含更多列):

AnimalSoundscore
dogarf0
catmeow0

我希望利用Animal、Sound及其他更多列来计算score字段的值。因为涉及列数较多,用lambda表达式不太方便,于是写了下面的代码:

def assign_score(data):
    if data.Animal == "dog":
        data.score += 1
    if data.Animal == "cat":
        data.score += 2
    if data.Sound== "arf":
        data.score += 10
    if data.Sound == "meow":
        data.score += 20
df.Score = df.apply(assign_score)

运行这段代码时出现了KeyError错误,请问有没有可行的解决方法?

问题分析与解决方案

你的代码主要有三个问题,我逐个给你说明并修正:

1. 列名大小写不匹配

你的DataFrame里的列是小写的score,但代码里写的是df.Score(大写S),这直接导致了KeyError——因为DataFrame里根本没有名为Score的列。

2. apply的axis参数错误

df.apply()默认是按列(axis=0)处理数据,但你的函数是针对每一行的逻辑,必须指定axis=1来让apply遍历每一行。

3. 函数没有返回值,且直接修改传入对象的方式不可靠

apply需要函数返回一个值来赋值给目标列,而你的函数只是修改了传入的data对象,却没有返回任何内容,最终会导致赋值后score列全是NaN。正确的做法是初始化一个score值,根据条件累加后返回它。

修正后的完整代码

import pandas as pd

# 先构造示例DataFrame
df = pd.DataFrame({
    'Animal': ['dog', 'cat'],
    'Sound': ['arf', 'meow'],
    'score': [0, 0]
})

def assign_score(row):
    # 初始化score为原始值,也可以根据需求设为0
    score = row['score']
    if row.Animal == "dog":
        score += 1
    if row.Animal == "cat":
        score += 2
    if row.Sound == "arf":
        score += 10
    if row.Sound == "meow":
        score += 20
    return score

# 修正列名,指定axis=1按行处理
df['score'] = df.apply(assign_score, axis=1)

运行这段代码后,你会得到正确的结果:

AnimalSoundscore
dogarf11
catmeow22

额外优化建议

如果后续涉及更多列的复杂判断,还可以考虑用np.select()来实现,代码会更简洁易读,性能也比apply更好(尤其是数据量较大时)。比如:

import numpy as np

conditions = [
    (df['Animal'] == 'dog') & (df['Sound'] == 'arf'),
    (df['Animal'] == 'cat') & (df['Sound'] == 'meow')
]
choices = [1+10, 2+20]
# 加上原始score值
df['score'] = df['score'] + np.select(conditions, choices, default=0)

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 16:42:51