在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
相关产品推荐
相关产品推荐

