如何从多个CSV提取数据并生成含折数列的DataFrame?
问题分析与解决方案
原代码错误原因
- 索引不存在触发KeyError:初始
loss_list是空DataFrame,没有任何行索引,直接用loc[i+j*(i+1)]访问不存在的索引(比如0),导致报错。 - 列赋值逻辑错误:
loss_list['fold'] = i+1会把整个fold列的所有行都设为当前折数,完全覆盖之前内容,不符合按折分配的需求。 - 值添加方式错误:
loss_list.loc[...]['fold'].append()是错误用法,pandas的Series不能通过这种方式追加单个值,且链式索引会返回视图,修改无法同步到原DataFrame。
正确实现代码
import pandas as pd # 存储每个折的DataFrame的列表 fold_dfs = [] # 遍历文件列表,同时获取从1开始的折数 for fold_num, filename in enumerate(loss_file_list, start=1): # 读取无索引CSV,指定列名为loss(原CSV无表头) single_fold_loss = pd.read_csv(path + filename, header=None, names=['loss']) # 添加当前折数的列 single_fold_loss['fold'] = fold_num # 将当前折的DataFrame加入列表 fold_dfs.append(single_fold_loss) # 合并所有折的数据,重置索引避免冲突 final_loss_df = pd.concat(fold_dfs, ignore_index=True) # 调整列顺序为fold在前,loss在后 final_loss_df = final_loss_df[['fold', 'loss']]
代码说明
- 用
enumerate直接生成从1开始的折数,无需手动计算i+1,逻辑更清晰。 - 读取CSV时指定
header=None, names=['loss'],确保无表头的CSV被正确解析为loss列。 - 每个折生成独立的DataFrame并添加
fold列,最后通过pd.concat合并所有数据,ignore_index=True重置索引,避免不同折的索引重复。
内容的提问来源于stack exchange,提问作者pav
相关产品推荐
相关产品推荐

