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

如何从多个CSV提取数据并生成含折数列的DataFrame?

问题分析与解决方案

原代码错误原因

  1. 索引不存在触发KeyError:初始loss_list是空DataFrame,没有任何行索引,直接用loc[i+j*(i+1)]访问不存在的索引(比如0),导致报错。
  2. 列赋值逻辑错误:loss_list['fold'] = i+1会把整个fold列的所有行都设为当前折数,完全覆盖之前内容,不符合按折分配的需求。
  3. 值添加方式错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 16:39:53