Python 根据观察名称,将数据分为训练和熊猫测试

Python 根据观察名称,将数据分为训练和熊猫测试,python,pandas,partitioning,training-data,Python,Pandas,Partitioning,Training Data,我想把我的数据框分成训练和测试数据。有一篇关于如何随机完成这项工作的帖子。然而,我需要根据观察值的名称对其进行拆分,以确保(例如)样本名称为“X”的2/3观察值分配给训练数据,样本名称为“X”的1/3观察值分配给测试数据 以下是我的DF的顶部: 136 137 138 139 141 143 144 145 146 \ Sample

我想把我的数据框分成训练和测试数据。有一篇关于如何随机完成这项工作的帖子。然而,我需要根据观察值的名称对其进行拆分,以确保(例如)样本名称为“X”的2/3观察值分配给训练数据,样本名称为“X”的1/3观察值分配给测试数据

以下是我的DF的顶部:

             136       137       138       139  141  143  144  145       146  \
Sample                                                                         
HC10    0.000000  0.000000  0.000000  0.000000  0.0  0.0  0.0  0.0  0.140901   
HC10    0.000000  0.000000  0.000000  0.267913  0.0  0.0  0.0  0.0  0.000000   
HC10    0.000000  0.000000  0.000000  0.000000  0.0  0.0  0.0  0.0  0.174445   
HC11    0.059915  0.212442  0.255549  0.000000  0.0  0.0  0.0  0.0  0.000000   
HC11    0.000000  0.115988  0.144056  0.070028  0.0  0.0  0.0  0.0  0.000000   

        147       148  149       150  151       152      154       156  158  \
Sample                                                                        
HC10    0.0  0.189937  0.0  0.052635  0.0  0.148751  0.00000  0.000000  0.0   
HC10    0.0  0.000000  0.0  0.267764  0.0  0.000000  0.00000  0.000000  0.0   
HC10    0.0  0.208134  0.0  0.130212  0.0  0.165507  0.00000  0.000000  0.0   
HC11    0.0  0.000000  0.0  0.000000  0.0  0.000000  0.06991  0.102209  0.0   
HC11    0.0  0.065779  0.0  0.072278  0.0  0.060815  0.00000  0.060494  0.0   

             160  173  
Sample                 
HC10    0.051911  0.0  
HC10    0.281227  0.0  
HC10    0.000000  0.0  
HC11    0.000000  0.0  
HC11    0.073956  0.0
Sample是数据帧的索引,其余是数字

如果我使用以下解决方案:

train=df.sample(frac=0.8,random_state=200)
test=df.drop(train.index)
正如建议的那样,我的df中的HC10等样本可能全部分配给训练数据,但我将无法在它们上测试我的模型。有没有人知道一种快速的方法(最好使用pandas)可以用这种方法对数据进行分区


非常感谢

您可以进行分组抽样,以保持每组的平衡。我将修改您的小示例:

import pandas as pd
df = pd.DataFrame({
    'group': ['a', 'a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b'], 
    'x':range(10)
})

train = df.reset_index(                  # need to keep the index as a column
    ).groupby('group'                    # split by "group"
    ).apply(lambda x: x.sample(frac=0.6) # in each group, do the random split
    ).reset_index(drop=True              # index now is group id - reset it
    ).set_index('index')                 # reset the original index
test = df.drop(train.index)              # now we can subtract it from the rest of data

另一种解决方案是使用分层抽样算法,如scikit learn。

处理此类担忧的正常方法是使用交叉验证,即对数据的多个随机分割进行培训和测试。您在寻找吗?我听说过使用交叉验证(我不是统计学家,所以不太熟悉). 那么,您是否建议按上述方式进行分区,然后运行交叉验证?我会在一个循环中这样做几次,然后通过管道传递到一个模型中吗?或者还有另一种被认为是最佳实践的方法吗?那么这基本上就是添加另一个变量来将每个观察分配给一个组,然后基于此进行分区吗?是的,没错。我们的目标是尽可能均匀地分配这个变量。在我发布之前,我曾经尝试过类似的方法,但问题是它不是很动态。i、 e.如果我想像其他人提到的那样,以不同的训练/测试集为例进行交叉验证,那么数据集有一个固定的组标签-除非我不理解您的代码?组标签是固定的,但可能会以不同的方式拆分多次(试试!)。