使用Python DataFrame.apply基于多列计算score时出现KeyError的解决方法咨询
问题描述
我有一个结构如下的DataFrame(实际包含更多列):
| Animal | Sound | score |
|---|---|---|
| dog | arf | 0 |
| cat | meow | 0 |
我希望利用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)
运行这段代码后,你会得到正确的结果:
| Animal | Sound | score |
|---|---|---|
| dog | arf | 11 |
| cat | meow | 22 |
额外优化建议
如果后续涉及更多列的复杂判断,还可以考虑用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
相关产品推荐
相关产品推荐

