如何基于索引从主数据集剔除测试集生成训练集(不使用train_test_split)
问题:从主数据集中剔除测试集得到训练集(不使用train_test_split)
需求说明
现有10行的主数据集,已随机抽取3行作为test_data,要求不使用train_test_split()方法,通过从主数据集中剔除测试数据集,得到7行的train_data。
数据定义代码
import pandas as pd import numpy as np data = pd.DataFrame({'job_title':np.random.choice(['data_science','Data_analysis'],10), 'level':np.random.choice(['entry','senior'],10), 'salary':np.random.choice((80000),10)})
主数据集示例
job_title level salary 0 Data_analysis senior 33929 1 Data_analysis senior 45698 2 data_science senior 33607 3 Data_analysis senior 65818 4 Data_analysis senior 66095 5 Data_analysis entry 4718 6 data_science senior 74770 7 data_science entry 3707 8 data_science senior 26820 9 Data_analysis entry 23887
测试数据集生成代码
test_data = data.sample(3, random_state=17) test_data
测试数据集示例
job_title level salary 7 Data_analysis senior 27174 2 data_science senior 58579 5 data_science senior 26554
解决方法
核心是利用行索引进行筛选,以下两种方法均可实现:
方法1:布尔索引筛选
# 筛选出索引不在test_data索引中的行 train_data = data[~data.index.isin(test_data.index)]
解释:test_data.index获取测试集的行索引,data.index.isin()判断主数据集每行的索引是否属于测试集,~符号取反,最终得到所有不在测试集中的行。
方法2:drop方法删除测试集行
# 直接删除test_data对应的索引行 train_data = data.drop(test_data.index)
解释:drop()方法接受索引列表作为参数,直接从主数据集中删除这些索引对应的行,剩余的就是训练集。
期望训练数据集示例
job_title level salary 0 Data_analysis senior 20003 1 data_science entry 28083 3 Data_analysis senior 12906 4 data_science senior 45588 6 Data_analysis senior 59851 8 Data_analysis senior 52008 9 data_science entry 32207
内容的提问来源于stack exchange,提问作者ramaa overseas
相关产品推荐
相关产品推荐

