Произвольно выберите строку из каждой группы, используя панд - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть pandas dataframe df, который выглядит следующим образом:

Month   Day mnthShape
1      1    1.016754224
1      1    1.099451003
1      1    0.963911929
1      2    1.016754224
1      1    1.099451003
1      2    0.963911929
1      3    1.016754224
1      3    1.099451003
1      3    1.783775568

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

Month   Day mnthShape
1       1   1.016754224
1       2   1.016754224
1       3   1.099451003

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

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Используйте groupby с помощью apply, чтобы выбрать случайную строку для каждой группы.

np.random.seed(0)
df.groupby(['Month', 'Day'])['mnthShape'].apply(np.random.choice).reset_index()

   Month  Day  mnthShape
0      1    1   1.016754
1      1    2   0.963912
2      1    3   1.099451

Если вы хотите узнать, по какому индексу получены строки выборки, используйте pd.Series.sample с n=1:

np.random.seed(0)
(df.groupby(['Month', 'Day'])['mnthShape']
   .apply(pd.Series.sample, n=1)
   .reset_index(level=[0, 1]))

   Month  Day  mnthShape
2      1    1   0.963912
3      1    2   1.016754
6      1    3   1.016754
0 голосов
/ 26 сентября 2018

Один из способов - Series.sample() случайная строка из каждой группы:

pd.np.random.seed(1)

res = df.groupby(['Month', 'Day'])['mnthShape'].apply(lambda x: x.sample()).reset_index(level=[0, 1])

res
   Month  Day  mnthShape
0      1    1   1.099451
1      1    2   1.016754
2      1    3   1.016754
...