我想将我的数据框分成训练和测试数据。如何随机执行此操作有一篇很棒的帖子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)?
非常感谢
答案 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。