2015-09-01 6 views
6

Qual è il modo migliore per ottenere un campione casuale degli elementi di un groupby? A quanto ho capito, un groupby è solo un iterabile su gruppi.Panda di Python che scelgono un campione casuale di gruppi da Groupby

Il metodo standard che avrei fatto questo per un iterabile se volevo selezionare N = 200 elementi è:

rand= random.sample(data, N) 

Se si tenta di cui sopra in cui i dati è un 'raggruppato' gli elementi della lista risultante sono tuple per qualche ragione.

Ho trovato l'esempio seguente per la selezione casuale degli elementi di una chiave singola groupby, tuttavia questo non funziona con un tasto multiplo groupby. Da, How to access pandas groupby dataframe by key

creare groupby oggetto

grouped = df.groupby('some_key') 

prelievo N dataframes e afferrare loro indicies

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

afferrare i gruppi

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

opzionalmente - girare tutto indietro in un singolo frame di dati obj ect

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

risposta

6

Si può prendere un campione randoms dei valori unici di df.some_key.unique(), l'uso che per affettare le df ed infine groupby sulla risultante:

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 

Se ci sono più di un GroupBy chiavi:

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 

Ma se hai intenzione di ottenere i valori di ogni gro up, non c'è nemmeno bisogno di groubpy, MultiIndex farà:

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

molto approfondita. Grazie per aver incluso gli esempi multi-indice. – sfortney