将pandas数据帧拆分为互斥的子集

时间:2017-03-17 21:04:56

标签: python pandas random

我正在对pandas数据框中包含的数据使用回归树分析。为了进行V形交叉验证,我需要将数据拆分为V个随机,互斥的子集

以下是我到目前为止所做的工作,我在数据框中添加了一个新的V = 10列,以表示每个样本属于哪个子集:

select  'https://www.website.com/events/143403?sid=1090794&mid=35'  as string_to_search
        ,regexp_substr(string_to_search, '^.*?(?<!/)(?=/)(?!//)')   as extract_domain
;

这种方法有效,但我觉得有更好的方法吗?这种方法的缺点是如果N = 108,那么

def Vfold_Subsets(Data,V):
    subs = Data
    Data['V'] = V
    N = Data.shape[0]
    n = N//V
    for v in range(1,V):
        sample = subs.sample(n = n)
        Data['V'][Data.index.isin(sample.index)] = v
        subs.drop(sample.index)
    return Data 

返回:

for v in range(1,V+1):
    print (v,': ',Data['V'][Data['V']==v].count())

我认为如果我能做到这样的话会更好

1 :  10
2 :  10
3 :  10
4 :  10
5 :  10
6 :  10
7 :  10
8 :  10
9 :  10
10 :  18

这样我就不会把剩下的所有样品都丢到最后一个箱子里。

1 个答案:

答案 0 :(得分:3)

定义你的功能

def Vfold_Subsets(Data, V):
    return Data.assign(
        V=np.random.permutation(np.arange(len(Data))) % V)