2015-09-01 3 views
6

Каков наилучший способ получить случайный образец элементов groupby? Насколько я понимаю, groupby - это просто перебор по группам.Python Pandas Выбор случайной выборки групп из Groupby

Стандартный способ, которым я хотел бы сделать это для итератора, если я хочу, чтобы выбрать N = 200 элементов:

rand= random.sample(data, N) 

Если вы попытаетесь выше, где данные является «сгруппированными» элементами результирующего списка являются кортежами по какой-то причине.

Я нашел приведенный ниже пример для случайного выбора элементов одного ключа groupby, однако это не работает с несколькими ключами groupby. С, How to access pandas groupby dataframe by key

создать GroupBy объект

grouped = df.groupby('some_key') 

пикап N dataframes и захватить их indicies

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

захватить группы

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

необязательно - превратить все это обратно в единый каркас данных ЭСТ

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

ответ

6

Вы можете взять образец Randoms уникальных значений df.some_key.unique(), использовать, чтобы нарезать df и, наконец, groupby на равнодействующей:

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 

Если есть более чем один GroupBy ключи:

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 

Но если вы только собираетесь получить значения каждого gro , вы не должны даже 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

Очень тщательно. Спасибо за включение примеров с несколькими индексами. – sfortney

Смежные вопросы