2017-03-17 5 views
2

パンダのデータフレームに含まれるデータについて回帰分析を使用しています。 V-foldクロスバリデーションを実行するには、私のデータをVのランダムで相互排他的なサブセットに分割する必要があります。パンダのデータフレームを相互に排他的なサブセットに分割する

これまでのところ、データフレームに新しい列V = 10を追加しました。

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 

このメソッドは機能しますが、私はそれを行うより良い方法があると感じていますか?この方法の欠点は、その後、N = 108場合である

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 : 10 
2 : 11 
3 : 11 
4 : 11 
5 : 11 
6 : 11 
7 : 11 
8 : 11 
9 : 10 
10 : 10 

ような何かを達成することができれば、それは良いことだと思います残りのすべてのサンプルを最後のビンに入れないでください。

+0

グループは偶数っぽいことする必要がありますか? – piRSquared

+0

私は彼らが絶対に必要であることを知らない、もし私が十分に大きいNを持っていれば、それは問題ではないと思う?しかし、私はそれらが好きです。 –

答えて

2

あなたの関数定義

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

素晴らしい作品、ありがとう! –

関連する問題