3

我正在尝试对数据集进行一些监督机器学习。

我的数据组织在一个 DataFrame 中,样本作为行,特征作为列。我的专栏之一包含样本所属的类别。

我想将我的数据集分成两半,以便样本在类别之间均匀分布。 是否有这样做的原生 pandas 方法,还是我必须遍历每一行并将每个样本单独分配给训练组或测试组?

这是我的数据如何组织的说明性示例。列char表示每行所属的类别。

                                              feature char
0   SimpleCV.Features.Blob.Blob object at (38, 74)...    A
1   SimpleCV.Features.Blob.Blob object at (284, 26...    A
2   SimpleCV.Features.Blob.Blob object at (87, 123...    B
3   SimpleCV.Features.Blob.Blob object at (198, 37...    B
4   SimpleCV.Features.Blob.Blob object at (345, 60...    C
5   SimpleCV.Features.Blob.Blob object at (139, 92...    C
6   SimpleCV.Features.Blob.Blob object at (167, 83...    D
7   SimpleCV.Features.Blob.Blob object at (57, 54)...    D
8   SimpleCV.Features.Blob.Blob object at (35, 77)...    E
9   SimpleCV.Features.Blob.Blob object at (136, 73...    E

参考上面的示例,我想最终得到两个 DataFrame,每个 DataFrame 包含每个char类别中一半的样本。在此示例中,每种char类型有两种,因此生成的 DataFrame 将分别有A一行、B一行等...

但是,我应该提到,char我的实际数据中每个类别的行数可能会有所不同。

首先十分感谢!

4

1 回答 1

3

这是一种方法:

>>> print d
          A         B Cat
0 -1.703752  0.659098   X
1  0.418694  0.507111   X
2  0.385922  1.055286   Y
3 -0.909748 -0.900903   Y
4 -0.845475  1.681000   Y
5  1.257767  2.465161   Y
>>> def whichHalf(t):
...     t['Div'] = 'Train'
...     t[:len(t)/2]['Div'] = 'Test'
...     return t
>>> d.groupby('Cat').apply(whichHalf)
          A         B Cat    Div
0 -1.703752  0.659098   X   Test
1  0.418694  0.507111   X  Train
2  0.385922  1.055286   Y   Test
3 -0.909748 -0.900903   Y   Test
4 -0.845475  1.681000   Y  Train
5  1.257767  2.465161   Y  Train

这会将每组的前半部分分配给测试集,将后半部分分配给训练集。然后,您可以通过过滤这个新的“Div”列来获得这两个集合。请注意,这仅在每个类别具有偶数个数据点时才有效。如果一个类别没有偶数个数据点,那么显然你不能将它平分为两部分。

于 2013-04-21T23:01:36.310 回答