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

如何实现Pandas DataFrame列表的训练-测试-验证集拆分?

如何为Pandas DataFrame列表实现训练-测试-验证集拆分?

问题场景

针对单个Pandas DataFrame,可通过以下代码按60%/20%/20%的比例拆分训练集、验证集、测试集:

train, validate, test = np.split(df.sample(frac=1, random_state=42), [int(.6*len(df)), int(.8*len(df))])

但针对DataFrame列表实现该逻辑时,编写的代码触发语法错误:

错误代码

import pandas as pd
train, validate, test = zip(*[(dfs[i][np.split(dfs[i].sample(frac=1, random_state), [int(.6*len(dfs[i])), int(.8*len(dfs[i]))]) for i in range(len(dfs))])])

报错信息

SyntaxError: positional argument follows keyword argument

正确实现方案

错误代码存在两个核心问题:一是错误使用dfs[i][np.split(...)]的索引方式,np.split直接返回拆分后的DataFrame列表,无需额外索引;二是sample方法的random_state参数缺失具体值,且括号嵌套逻辑混乱。以下是两种简洁的正确实现:

方式一:列表推导式+zip解包

import numpy as np
import pandas as pd

# 假设dfs是待处理的DataFrame列表
split_results = [np.split(df.sample(frac=1, random_state=42), [int(.6*len(df)), int(.8*len(df))]) for df in dfs]
train, validate, test = zip(*split_results)
  • 遍历每个DataFrame,完成打乱与拆分,得到包含(训练集, 验证集, 测试集)元组的列表
  • 通过zip(*split_results)将所有训练集、验证集、测试集分别打包,再解包给对应变量

方式二:循环逐个处理

若偏好更直观的逻辑,可使用循环逐个处理每个DataFrame:

import numpy as np
import pandas as pd

train = []
validate = []
test = []

for df in dfs:
    shuffled_df = df.sample(frac=1, random_state=42)
    train_part, val_part, test_part = np.split(shuffled_df, [int(.6*len(df)), int(.8*len(df))])
    train.append(train_part)
    validate.append(val_part)
    test.append(test_part)

该方式逻辑清晰,适合需要对每个拆分结果添加额外处理的场景。

注意:若希望每个DataFrame使用不同的随机打乱种子,可将random_state设置为循环相关值(如random_state=i),或直接移除该参数让每次打乱完全随机。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 08:25:08