我有一个pandas数据框,我想将其分成3个独立的集合。我知道可以使用来自sklearn.cross_validation
的train_test_split将数据分成两个集合(训练和测试)。然而,我找不到任何关于将数据分成三个集合的解决方案。最好,我希望能得到原始数据的索引。
我知道一个变通方法是使用train_test_split
两次,并以某种方式调整索引。但是,有没有更标准的/内置的方法可以将数据分成3个集合而不是2个呢?
回答:
Numpy解决方案。我们将首先打乱整个数据集(df.sample(frac=1, random_state=42)
),然后将我们的数据集分成以下部分:
- 60% – 训练集,
- 20% – 验证集,
- 20% – 测试集
In [305]: train, validate, test = \ np.split(df.sample(frac=1, random_state=42), [int(.6*len(df)), int(.8*len(df))])In [306]: trainOut[306]: A B C D E0 0.046919 0.792216 0.206294 0.440346 0.0389602 0.301010 0.625697 0.604724 0.936968 0.8700641 0.642237 0.690403 0.813658 0.525379 0.3960539 0.488484 0.389640 0.599637 0.122919 0.1065058 0.842717 0.793315 0.554084 0.100361 0.3674657 0.185214 0.603661 0.217677 0.281780 0.938540In [307]: validateOut[307]: A B C D E5 0.806176 0.008896 0.362878 0.058903 0.0263286 0.145777 0.485765 0.589272 0.806329 0.703479In [308]: testOut[308]: A B C D E4 0.521640 0.332210 0.370177 0.859169 0.4010873 0.333348 0.964011 0.083498 0.670386 0.169619
[int(.6*len(df)), int(.8*len(df))]
– 是numpy.split()的indices_or_sections
数组。
这里是一个关于np.split()
使用的小演示 – 让我们将一个包含20个元素的数组分成以下部分:80%,10%,10%:
In [45]: a = np.arange(1, 21)In [46]: aOut[46]: array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20])In [47]: np.split(a, [int(.8 * len(a)), int(.9 * len(a))])Out[47]:[array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]), array([17, 18]), array([19, 20])]