将数据分成训练并用大熊猫测试观察名称

时间:2018-02-15 14:33:52

标签: python pandas partitioning training-data

我想将我的数据框分成训练和测试数据。如何随机执行此操作有一篇很棒的帖子here。但是,我需要根据观察的名称将其拆分,以确保(例如)将样本名称为“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)

正如所建议的那样here然后我的df中的HC10等样本都可以分配给训练数据,但我无法在它们上测试我的模型。有没有人知道以这种方式对数据进行分区的快速方法(理想情况下使用pandas)?

非常感谢

1 个答案:

答案 0 :(得分:0)

您可以进行抽样组-wize,以保持每组的平衡。我将修改你的小例子:

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。