2017-01-25 6 views
0

私はパンダを使用していますが、私は約4百万の観測データを持っています。 各クラス(クラスは単なる列)の50個のランダム要素または最初の50個の要素を選択するには、最高/最速/最も効率的な方法が何であるか疑問に思っていました。各クラスのn要素の選択

私の列の一意のクラス数は約2kで、100,000要素、各クラスごとに50要素のサブセットを選択したいと思います。

私はそれらをクラスにグループ化し、次に各グループを繰り返し、最初の50要素を選択してから次のグループに進むことを考えていました。

私はこれを行うより良い方法があるのだろうか?

答えて

1

を考えると、次のデータフレーム

df = pd.DataFrame(np.random.rand(100, 2), columns=list('ab')) 
df['group'] = np.remainder(np.random.permutation(len(df)), 3) 

df.head() 

    a   b   group 
0 0.069140 0.553955 1 
1 0.564991 0.699645 2 
2 0.251304 0.516667 2 
3 0.962819 0.314219 2 
4 0.353382 0.500961 0 

あなたは順列を生成し、大きさでそれを減らすまず、Nのランダム要素を選択するには

df_randomized = df.ix[np.random.permutation(len(df))] 

df_randomized.head() 

    a   b   group 
90 0.734971 0.895469 0 
35 0.195013 0.566211 0 
27 0.370124 0.870052 2 
21 0.297194 0.500713 1 
66 0.319668 0.347365 2 

によってランダム化されたバージョンを取得することができます。グループのことができます。データフレームを、各グループの最初のN個の要素を取得し、最初のN個の要素を選択するための方法を適用するには

N = 10 
indexes = np.random.permutation(len(df))[:N] 
df_randomized = df.ix[indexes] 

:その後のデータフレームに適用します。パンダはあなたのためにそれを扱うことができるよう、ここで任意のループの必要はありません:彼らはnumpyのか、パンダのいずれかの内部最適化された方法を使用して

N = 10 
df.groupby('group')\ 
    .apply(lambda x: x[:N][['a', 'b']]) 

これらのメソッドのすべてが高速である必要があります。

1

IIUCあなたが使用する必要がnumpy.random.choice

import pandas as pd 
import numpy as np 

df = pd.DataFrame({'class': [0,1,2,3,0,1,2,3,0,1,2,3], 
       'value': [1,2,3,4,5,6,7,8,9,10,1,12]}) 


Samplesize = 2 #number of samples that you want  
print df.groupby('class', as_index=False).apply(lambda array: array.loc[np.random.choice(array.index, Samplesize, False),:]) 

入力

class value 
0  0  1 
1  1  2 
2  2  3 
3  3  4 
4  0  5 
5  1  6 
6  2  7 
7  3  8 
8  0  9 
9  1  10 
10  2  1 
11  3  12 

出力

 class value 
0 8  0  9 
    0  0  1 
1 1  1  2 
    5  1  6 
2 6  2  7 
    10  2  1 
3 11  3  12 
    3  3  4 
+0

答えていただきありがとうございます。しかし、指定されたSamplesizeより小さい観測数のクラスがある場合、私はその解決策を使用できません。 ValueError: 'replace = False'のとき、人口より大きなサンプルを取ることはできません。 – sebb

+0

print df.groupby( 'class'、as_index = False).apply(lambda array:array.loc [np.random.choice(array.index) 、Samplesize、True)、:]) これは、Trueのときにサンプルが重複する可能性があることを覚えておいてください。 – Shijo

+0

@sebbあなたは、各クラスの要素を50個必要としました。クラスの要素が50個未満の場合は、それを持つことはできませんので、例外を発生させることは適切なことと思われます。 – Goyo

関連する問題