拆分3个子组中的数据帧

时间:2016-07-01 07:16:30

标签: python pandas dataframe

我想将原始数据框分成3个子组:训练,测试,验证

我看到三种解决方案,但担心它们不正确并可能导致瓶颈效应

1)使用键添加词典

my_dict = {'train':raw_df.loc[start:end], 'test':raw_df.loc[start:end],
            'val':raw_df.loc[start:end]}

2)创建三个数据帧

train_df = df.loc[start:end]
test_df = df.loc[start:end]
val_df = df.loc[start:end]

3)使用随机的三个随机值之一添加新列

df['train/test/val'] = pd.Series('train', index=df.index)

另外,会在字典中添加数据帧导致:在字典或列表中帮助丢失数据帧性能优势的bottle_neck效果? 理论上添加新列是增加数据维度 创建新的数据帧我认为是最糟糕的变种,因为它会占用大量的内存

3 个答案:

答案 0 :(得分:3)

添加新列不会吃掉大量的记忆,但只要您想要访问三个中的一个,就会增加切片成本。创建新的数据框导致这个切片部分只能完成一次。

为此,您可以使用sample。让您想要80%的数据帧在列车中,10%在测试和验证中:

train = df.sample(frac = 0.8)
test = df.drop(train.index).sample(frac = 0.5)
validate = df.drop(train.index).drop(test.index)

答案 1 :(得分:0)

从技术上讲,如果您想测试机器学习模型,我认为您不需要有三个数据帧。为什么?因为您在training_set上构建了模型,并且需要使用validation_set对其进行验证。只有在验证模型后才能使用test_set。此外,您的test_set不包含Y标签。

多个库包含轻松分割数据的功能。

不使用任何外部库,您可以这样做:

msk = np.random.rand(len(df)) < 0.8
train = df[msk]
validation = df[~msk]

(回答:How do I create test and train samples from one dataframe with pandas?

希望这有帮助!

答案 2 :(得分:0)

仅用于单次迭代的纯大熊猫解决方案就是使用样本,并使用pd.Index.difference排除样本的索引以供下次迭代使用:

validation = df.sample(validation_size)
# Get the other part of the dataframe
train_test = df.loc[df.index.difference(validation.index)]

test = train_test.sample(test_size)
train = train_test.loc[train_test.index.difference(test.index)]

请注意,validation_sizetest_size分别是验证和测试框架所需的行数。

Sklearn还具有很强的功能,可以在循环中进行拆分,以便于交叉验证。这里的文档:http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.ShuffleSplit.html