IIUC, вы можете использовать pandas.qcut
, чтобы разрезать эпохи на 2 бункера одинакового размера (первая половина / вторая половина). Затем используйте groupby.mean
:
df.groupby(['session_id', pd.qcut(df.attempt_updated_at, q=2)])['question_difficulty'].mean()
[вне]
session_id attempt_updated_at
5c822af21c1fba22 (1557469684999.999, 1557475084000.0] 3.500
(1557475084000.0, 1557484232000.0] 4.125
Name: question_difficulty, dtype: float64
В качестве альтернативы, в зависимости от того, как вы определяете «первую половину» / «вторую половину», вам может потребоваться pandas.cut
вместо аргумента bins=2
(в этом случае временные ячейки будут быть на равном расстоянии друг от друга, в отличие от размера, равного qcut
выше) :
df.groupby(['session_id', pd.cut(df.attempt_updated_at, bins=2)])['question_difficulty'].mean()
[выход]
session_id attempt_updated_at
5c822af21c1fba22 (1557469670453.0, 1557476958500.0] 3.444444
(1557476958500.0, 1557484232000.0] 4.285714
Name: question_difficulty, dtype: float64
Обновление
Чтобы рассчитать различные периоды времени для уникального идентификатора сеанса, вам, возможно, сначала придется сгруппировать по session_id
; запустить вышеуказанный метод для каждой группы; наконец, concat
результаты. Вот пример использования списка:
groups_session_id = df.groupby('session_id')
pd.concat([g.groupby(['session_id', pd.cut(g['attempt_updated_at'], bins=2).astype(str)])
['question_difficulty'].mean() for _, g in groups_session_id])
Обновление 2
Чтобы добавить эти средние значения обратно в исходный DataFrame
, вы можете использовать DataFrame.merge
:
df_avg_question_difficulty = pd.concat([g.groupby(['session_id', pd.cut(g['attempt_updated_at'], bins=2, labels = [1, 2]).astype(str)])
['question_difficulty'].mean().unstack(1) for _, g in groups_session_id])
df = df.merge(df_avg_question_difficulty, left_on='session_id', right_index=True)