如何实现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
相关产品推荐
相关产品推荐

