2015-09-01 12 views
6

Jaki jest najlepszy sposób uzyskania losowej próbki elementów z groupby? Jak rozumiem, numer groupby jest po prostu możliwy do sprawdzenia przez grupy.Pandy Pythona Wybieranie losowej próbki grup z Groupby

Standardowy sposób byłoby to zrobić dla iterable gdybym chciał wybrać N = 200 elementy to:

rand= random.sample(data, N) 

Jeśli spróbujesz wyżej, gdzie dane jest „zgrupowane” elementy listy wynikowej są krotki z jakiegoś powodu.

Znalazłem poniższy przykład losowego wybierania elementów pojedynczego klucza groupby, jednak nie działa to z kluczem uniwersalnym groupby. Z, How to access pandas groupby dataframe by key

tworzyć GroupBy przedmiotu

grouped = df.groupby('some_key') 

odbiorem N dataframes i chwytają za Wiadomości Finansowe

sampled_df_i = random.sample(grouped.indicies,N) 

chwytak grupy

df_list = map(lambda df_i: grouped.get_group(df_i),sampled_df_i) 

ewentualnie - włącz wszystkie powrotem pojedyncza ramka danych obj ect

sampled_df = pd.concat(df_list, axis=0, join='outer') 

Odpowiedz

6

można pobrać próbkę Randoms unikalnych wartościach df.some_key.unique(), używać, aby pokroić df i wreszcie groupby na wypadkowej:

In [337]: 

df = pd.DataFrame({'some_key': [0,1,2,3,0,1,2,3,0,1,2,3], 
        'val':  [1,2,3,4,1,5,1,5,1,6,7,8]}) 
In [338]: 

print df[df.some_key.isin(random.sample(df.some_key.unique(),2))].groupby('some_key').mean() 
       val 
some_key   
0   1.000000 
2   3.666667 

Jeśli istnieje więcej niż jeden GroupBy klucze:

In [358]: 

df = pd.DataFrame({'some_key1':[0,1,2,3,0,1,2,3,0,1,2,3], 
        'some_key2':[0,0,0,0,1,1,1,1,2,2,2,2], 
        'val':  [1,2,3,4,1,5,1,5,1,6,7,8]}) 
In [359]: 

gby = df.groupby(['some_key1', 'some_key2']) 
In [360]: 

print gby.mean().ix[random.sample(gby.indices.keys(),2)] 
        val 
some_key1 some_key2  
1   1   5 
3   2   8 

Ale jeśli chcesz uzyskać wartości każdego grosza nawet nie musisz wykonywać groubpy, MultiIndex:

In [372]: 

idx = random.sample(set(pd.MultiIndex.from_product((df.some_key1, df.some_key2)).tolist()), 
        2) 
print df.set_index(['some_key1', 'some_key2']).ix[idx] 
        val 
some_key1 some_key2  
2   0   3 
3   1   5 
+0

Bardzo dokładny. Dziękujemy za uwzględnienie przykładów z wieloma indeksami. – sfortney