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

遍历CSV文件计算条件均值时Pandas抛出KeyError(目标列确认存在)

遍历CSV文件计算条件均值时Pandas抛出KeyError(目标列确认存在)

我之前也踩过这种「明明列名看着就在那,Pandas偏说找不到」的坑,太闹心了!咱们从几个常见的排查方向入手解决:

1. 先确认所有CSV文件都包含目标列

你现在只检查了rtAvg列是否存在,但没对cond(也就是block1_trigger)做同样的校验——很可能某几个CSV文件里确实没有这个列,导致遍历到它的时候直接抛出KeyError。

可以给cond列也加上缺失处理逻辑,比如如果列不存在,就给所有行的该列赋值一个特殊值(比如9999),或者直接跳过这个文件:

if cond not in df.columns:
    # 要么给默认值,后续计算时这些值会被过滤掉
    df[cond] = 9999
    # 或者直接跳过当前文件,避免后续报错
    # continue

2. 排查列名的隐形空白/特殊字符

有时候列名看起来是block1_trigger,但实际带有隐形的空格、制表符、换行符,或者是全角空格(肉眼根本看不出来)。可以先统一清理所有列名的前后空白:

# 清理所有列名的前后空白(包括空格、制表符、换行符)
df.columns = df.columns.str.strip()
# 重新给变量赋值,确保用的是清理后的列名
rtAvg = 'block1_respo.rt'
cond = 'block1_trigger'

如果还是不行,可以打印出列名的原始字符,看看有没有异常:

print("当前文件列名:", [repr(col) for col in df.columns])

这样能看到列名的真实样子,比如如果是'block1_trigger\n'(带换行符),就能一眼发现问题。

3. 优化代码的索引写法,避免链式索引问题

你现在用的df.loc[df[cond]==101][rtAvg].mean()属于链式索引,可能会触发Pandas的SettingWithCopyWarning,也会增加出错概率。建议换成更安全的单步索引写法:

con1 = df.loc[df[cond]==101, rtAvg].mean()
con2 = df.loc[df[cond]==102, rtAvg].mean()
con3 = df.loc[df[cond]==103, rtAvg].mean()
con4 = df.loc[df[cond]==104, rtAvg].mean()

修改后的完整代码

把上面的优化点整合进去,代码会更健壮:

import os
import pandas as pd

folder_path = 'D:/Libraries/Documents/data'
rtAvg = 'block1_respo.rt'
cond = 'block1_trigger'
output_file = 'results_compiled.csv'

df_list = []

for filename in os.listdir(folder_path):
    if filename.endswith('.csv'):
        # Load the CSV file into a data frame
        df = pd.read_csv(os.path.join(folder_path, filename))
        
        # 第一步:清理所有列名的前后隐形字符
        df.columns = df.columns.str.strip()
        
        # 检查rtAvg列是否存在,缺失则填充9999
        if rtAvg not in df.columns:
            df[rtAvg] = 9999
        
        # 检查cond列是否存在,缺失则填充9999(或者跳过文件)
        if cond not in df.columns:
            df[cond] = 9999
            # 如果不想处理缺失列的文件,直接跳过:
            # continue
        
        # 用安全的索引方式计算均值
        rt_mean_b1 = df[rtAvg].mean()
        con1 = df.loc[df[cond]==101, rtAvg].mean()
        con2 = df.loc[df[cond]==102, rtAvg].mean()
        con3 = df.loc[df[cond]==103, rtAvg].mean()
        con4 = df.loc[df[cond]==104, rtAvg].mean()
        
        # Create a new row for the summary data
        summary_row = pd.DataFrame({
            'csv_file': filename,
            'rt_average': rt_mean_b1,
            '101_rt': con1,
            '102_rt': con2,
            '103_rt': con3,
            '104_rt': con4
        }, index=[0])
        
        # Append the summary data to the list of data frames
        df_list.append(summary_row)

summary_df = pd.concat(df_list)
summary_df.to_csv(output_file, index=False)

先试试上面的方案,大概率能解决你的KeyError问题!

备注:内容来源于stack exchange,提问作者JayDee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 10:54:05