Python Pandas Выбор произвольной выборки групп из Groupby

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

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

rand= random.sample(data, N)

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

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

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

grouped = df.groupby('some_key')

выберите N фреймов данных и возьмите их знаки

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

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

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

необязательно - вернуть все обратно в один объект dataframe

sampled_df = pd.concat(df_list, axis=0, join='outer')
1 ответ

Вы можете взять образец 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

Если имеется более одной группы с ключами:

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

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

licensed under cc by-sa 3.0 with attribution.