Группа панд по последовательным номерам - PullRequest
1 голос
/ 04 ноября 2019

Я имею дело с DataFrame следующим образом:

n_days    probability
 0            0.01
 17           0.1
 18           0.11
 19           0.12
 40           0.2
 41           0.21

Я хочу сгруппировать последовательные числа и получить среднюю вероятность для каждой группы, например:

n_days     mean_probability
  0           0.01
 17-19        0.11
 40-41        0.205

Форматированиена n_days не слишком актуально.

Я пробовал что-то вроде:

df['diff_days'] = df.n_days - df.n_days.shift()

А потом:

df.diff_days.eq(1)

Что приводит к этому логическому:

n_days    probability   bool_eq
 0            0.01       False
 17           0.1        False
 18           0.11       True
 19           0.12       True       
 40           0.2        False
 41           0.21       True

Это кажется шагом вперед, но я не знаю, как это сделать. Каждый False будет началом каждой группы, но как мне поймать всю группу? Любая помощь будет оценена. Благодаря.

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Вы можете группировать по pd.cut корзинам. Обратите внимание, что каждая ячейка от, но исключая первое значение до включающего последнего значения, например (16-19] эквивалентна [17-19], где столбец состоит из целых чисел.

bins = [-1, 0, 16, 19, 39, 41]
>>> df.groupby(
        pd.cut(df['n_days'], bins))['probability'].mean().dropna()
n_days
(-1, 0]     0.010
(16, 19]    0.110
(39, 41]    0.205
Name: probability, dtype: float64
1 голос
/ 04 ноября 2019

Вы можете использовать pd.cut + DataFrame.groupby:

mean_probability=df.groupby(pd.cut(df.n_days,len(df)//2)).probability.mean()

n_days
(-0.041, 13.667]    0.010
(13.667, 27.333]    0.110
(27.333, 41.0]      0.205
Name: probability, dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...