如何通过pandas冒号切片合并多段区间数据构造自定义训练集
按指定索引拆分训练集、测试集实现方案
需求为取位置索引40-80区间的数据作为测试集,合并[:40]、[80:]两个区间作为训练集,可通过以下两种方式实现:
方法1:拼接切片
用pandas内置的concat方法直接拼接训练集对应的两个片段即可,和原生切片逻辑完全一致:import pandas as pd # 测试集取40-80位置数据,pandas切片遵循左闭右开规则,实际包含40到79位共40条数据 X_test = x.iloc[40:80] y_test = y.iloc[40:80] # 拼接前后两段作为训练集 X_train = pd.concat([x.iloc[:40], x.iloc[80:]]) y_train = pd.concat([y.iloc[:40], y.iloc[80:]])所有切片统一用
.iloc[]实现,是为了兼容行索引非默认连续整数的场景,避免直接用[]按标签切片导致的取数错误,写法更稳妥。如果需要调整测试集区间,直接修改切片的起止数值即可,比如取50-80作为测试集时,对应把测试集切片改为x.iloc[50:80],训练集拼接的两个片段改为x.iloc[:50]、x.iloc[80:]即可。方法2:布尔掩码筛选
数据量较大时推荐用该方法,无需拼接操作,运行效率更高:import numpy as np # 生成和数据集行数一致的布尔数组,测试集对应位置标记为True test_mask = np.zeros(len(x), dtype=bool) test_mask[40:80] = True # 按掩码直接筛选对应集合 X_test = x[test_mask] y_test = y[test_mask] X_train = x[~test_mask] # ~为按位取反,即筛选所有不属于测试集的行 y_train = y[~test_mask]该方法不会改变原数据的行顺序,逻辑更直观,调整测试集区间时只需要修改
test_mask的切片范围即可。
内容的提问来源于stack exchange,提问作者ahm ane
相关产品推荐
相关产品推荐

