Выбор случайных значений из кадра данных без замены - PullRequest
0 голосов
/ 01 октября 2018

Я следую за ответом по ссылке :

Если у меня есть датафрейм df:

Month   Day     mnthShape
1      1    1.01
1      1    1.09
1      1    0.96
1      2    1.01
1      1    1.09
1      2    0.96
1      3    1.01
1      3    1.09
1      3    1.78

Я хочу получить следующее от df:

Month   Day mnthShape
1       1   1.01
1       2   1.01
1       1   0.96

, где значения mnthShape выбираются случайным образом из индекса without replacement.то есть, если запрос df.loc[(1, 1)], он должен найти все значения для (1, 1) и случайным образом выбрать из него значение, которое будет отображаться выше.Если появляется другой df.loc[(1,1)], он должен снова выбирать случайным образом, но без замены.

Я знаю, что мне нужно изменить код, чтобы использовать следующее:

apply(np.random.choice, replace=False)

Но не уверен, как это сделать.

Редактировать: Каждый раз, когда я делаю df.loc[(1, 1)], он должен давать новое значение без замены.Я намерен сделать df.loc[(1, 1)] несколько раз.В предыдущем вопросе это был только один раз.

1 Ответ

0 голосов
/ 01 октября 2018

Если вы пытаетесь выполнить выборку из набора данных без замены, возможно, имеет смысл сделать все это за один раз, а не итеративно извлекать выборку из набора данных.

Извлечение N выборок из каждого месяца/ день комбо требует, чтобы было достаточно комбинаций, чтобы вытащить N без замены.Но предполагая, что это правда, вы можете написать функцию для выборки N значений из подмножества данных:

def select_n(subset, n=2):
    choices = np.random.choice(len(x), size=n, replace=False)
    return (
        subset
        .mnthShape
        .iloc[choices]
        .reset_index(drop=True)
        .rename_axis('choice'))

, чтобы применить это ко всему набору данных:

In [34]: df.groupby(['Month', 'Day']).apply(select_n)
Out[34]:
choice        0     1
Month Day
1     1    1.09  0.96
      2    0.96  1.01
      3    1.09  1.01

Если выдействительно нужно извлекать их по одному, вам все равно нужно будет генерировать образцы одновременно, чтобы гарантировать, что они будут нарисованы без замены, но вы можете сгенерировать индексы выборки отдельно от подмножества данных:

In [48]: indices = np.random.choice(3, size=2, replace=False)

In [49]: df[((df.Month == 1) & (df.Day == 2))].iloc[indices[0]]
Out[49]:
Month        1.00
Day          2.00
mnthShape    1.01
Name: 3, dtype: float64

In [50]: df[((df.Month == 1) & (df.Day == 2))].iloc[indices[1]]
Out[50]:
Month        1.00
Day          2.00
mnthShape    0.96
Name: 5, dtype: float64
...