如何根据纪元时间('attempt_updated_at'列)获得上半场和下半场

How do I get the first half and second half depending on the epoch time('attempt_updated_at' column)

所以,我想找出'Avg. difficulty level in first vs. second half of each session',我找不到合适的方法来解决这个问题。 我使用纪元时间将会话分成两半,然后找到平均难度级别。

session_id  question_difficulty     attempt_updated_at
5c822af21c1fba22            2   1557470128000
5c822af21c1fba22            3   1557469685000
5c822af21c1fba22            4   1557470079000
5c822af21c1fba22            5   1557472999000
5c822af21c1fba22            3   1557474145000
5c822af21c1fba22            3   1557474441000
5c822af21c1fba22            4   1557474299000
5c822af21c1fba22            4   1557474738000
5c822af21c1fba22            3   1557475430000
5c822af21c1fba22            4   1557476960000
5c822af21c1fba22            5   1557477458000
5c822af21c1fba22            2   1557478118000
5c822af21c1fba22            5   1557482556000
5c822af21c1fba22            4   1557482809000
5c822af21c1fba22            5   1557482886000
5c822af21c1fba22            5   1557484232000

我正在研究 python pandas(Jupter Notebook)。

代码方面我不知道从哪里开始。 (新手提醒)

我希望输出如下:

session_id上半场难度下半场难度

IIUC,你可以使用 pandas.qcut to cut epochs into 2 equally sized bins (first half / second half). Then use 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

或者,根据您定义 'first half' / 'second half' 的方式,您可能需要 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 的不同时间段,您可能首先必须按 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)