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

在AWS Lambda中执行df['c']=df['a']+df['b']报KeyError:'a'求助

解决AWS Lambda中DataFrame访问列名报错KeyError的问题

错误原因

你用csv.reader读取CSV后直接转成DataFrame时,CSV的第一行(表头'a'、'b')会被当作普通数据行,导致DataFrame的列名是默认的数字索引(0、1、...),而非你预期的'a'、'b',所以访问df['a']会触发KeyError。

修复方案

方案1:用pandas直接读取CSV(推荐)

pandas的read_csv可以直接从S3对象流读取,自动识别表头,代码更简洁且不易出错:

s3Client = boto3.client('s3')
import pandas as pd
import boto3

def lambda_handler(event, context):
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = event['Records'][0]['s3']['object']['key']
    
    response = s3Client.get_object(Bucket=bucket, Key=key)
    
    # 直接读取CSV并自动识别表头
    df = pd.read_csv(response['Body'])
    df['c'] = df['a'] + df['b']
    # 可添加后续逻辑,比如将结果写入S3

方案2:手动处理csv.reader的表头

如果一定要用csv.reader,需要把读取到的第一行设为DataFrame的列名:

s3Client = boto3.client('s3')
import pandas as pd
from csv import reader
import boto3

def lambda_handler(event, context):
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = event['Records'][0]['s3']['object']['key']
    
    response = s3Client.get_object(Bucket=bucket, Key=key)
    
    data = response['Body'].read().decode('utf-8')
    csv_rows = list(reader(data))
    
    # 第一行作为列名,剩余行作为数据
    df = pd.DataFrame(csv_rows[1:], columns=csv_rows[0])
    # 注意:如果a、b是数值类型,需要先转成数值再相加,否则会字符串拼接
    df['a'] = pd.to_numeric(df['a'])
    df['b'] = pd.to_numeric(df['b'])
    df['c'] = df['a'] + df['b']

额外检查点

  • 确认CSV表头确实是a、b,没有空格、大小写差异(比如A和a是不同列名)
  • 如果CSV用了非逗号分隔符(比如制表符),在read_csv里添加sep='\t'这类参数指定分隔符

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:09:16