如何创建一个DataFrame,其中包含另一个DataFrame的一半数据,并均匀分布在列中的值?

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类别中的行数可以有所不同。
非常感谢!
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”列来获取两个数据集。需要注意的是,只有当每个类别具有偶数个数据点时,此方法才有效。如果某个类别的数据点不是偶数,则无法将其平均分为两部分。


2
我没有时间深入探讨,但我想到的是类似于 df.sort("char").groupby(np.arange(len(df)) % 2) 的东西。 - DSM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接