
本文介绍如何在使用train_test_split划分数据后,将X_train、X_test、y_train、y_test无损还原为原始DataFrame结构(保留列名、列序、数据类型),并导出为CSV文件。
本文介绍如何在使用`train_test_split`划分数据后,将`x_train`、`x_test`、`y_train`、`y_test`无损还原为原始dataframe结构(保留列名、列序、数据类型),并导出为csv文件。
在机器学习流程中,有时需将已划分的训练集和测试集重新合并(例如用于后续分析、模型解释或交付数据),但必须严格保持原始数据的列名、列顺序、索引逻辑及数据完整性。关键在于:不能仅拼接数值数组,而应重建带列名的DataFrame,并确保y列准确归位至原始位置(如最后一列或指定列名 'label')。
✅ 正确做法:基于原始列结构重建DataFrame
假设原始数据为 df,其中目标变量列为 'label'(位于最后一列),且划分前已通过 .values 转为 NumPy 数组。由于 train_test_split 会打乱行顺序(即使设 stratify=y 也改变原始索引),我们无法恢复原始索引,但可完全复现原始列结构:
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
# 假设 df 是原始 DataFrame
X = df.drop('label', axis=1).values
y = df['label'].values # 直接取值,无需 reshape 和 ravel 的冗余操作
X_train, X_test, y_train, y_test = train_test_split(
X, y,
train_size=0.8,
test_size=0.2,
random_state=0,
stratify=y
)
# 步骤1:将训练/测试特征与标签分别水平拼接(保持列对齐)
train_full = np.hstack([X_train, y_train.reshape(-1, 1)])
test_full = np.hstack([X_test, y_test.reshape(-1, 1)])
# 步骤2:沿行方向合并,并用原始列名构建新 DataFrame
# 注意:df.columns 包含所有列(如 ['feat1','feat2',..., 'label']),顺序完全一致
merged_array = np.vstack([train_full, test_full])
df_merged = pd.DataFrame(merged_array, columns=df.columns)
# 步骤3:保存为 CSV(默认不保存索引,避免引入额外列)
df_merged.to_csv('merged_dataset.csv', index=False)
⚠️ 重要注意事项
-
列名必须精确匹配:df.columns 是唯一可信的列定义来源。若原始 df 中 'label' 不在末尾,请先确认其位置,必要时显式指定列顺序:
Knowledge Graph - Csv Graph Loader Generator下载从 CSV 数据集生成图数据库加载器和三元组映射。将表格 CSV 数据转换为图数据库可直接使用的节点、边和三元组。
# 若 label 在第3列(索引2),可构造列顺序 feature_cols = [col for col in df.columns if col != 'label'] columns_order = feature_cols + ['label'] # 或按需调整 df_merged = pd.DataFrame(merged_array, columns=columns_order)
-
数据类型可能丢失:np.hstack / np.vstack 会将全部数据转为统一 dtype(如 float64)。若原始数据含字符串、布尔或整型类别,建议改用 pd.concat 保留类型:
# 更鲁棒的方式:用 DataFrame 操作(需先还原特征列名) X_train_df = pd.DataFrame(X_train, columns=df.drop('label', axis=1).columns) X_test_df = pd.DataFrame(X_test, columns=df.drop('label', axis=1).columns) y_train_ser = pd.Series(y_train, name='label') y_test_ser = pd.Series(y_test, name='label') train_df = pd.concat([X_train_df, y_train_ser], axis=1) test_df = pd.concat([X_test_df, y_test_ser], axis=1) df_merged = pd.concat([train_df, test_df], ignore_index=True) df_merged.to_csv('merged_dataset.csv', index=False) 索引不可恢复:train_test_split 默认打乱顺序,原始行索引已丢失。若需保留原始顺序(如时间序列场景),应在划分前使用 shuffle=False,或通过 indices 参数记录切分位置。
最终生成的 merged_dataset.csv 将与原始 df 具有完全相同的列名、列序和数据维度(行数 = 原始行数),可直接用于下游任务或交付。










