如何根据纪元时间获得前半部分和后半部分('attempt updated_at' 列)
Posted
技术标签:
【中文标题】如何根据纪元时间获得前半部分和后半部分(\'attempt updated_at\' 列)【英文标题】:How do I get the first half and second half depending on the epoch time('attempt_updated_at' column)如何根据纪元时间获得前半部分和后半部分('attempt updated_at' 列) 【发布时间】:2019-11-15 00:57:03 【问题描述】:所以,我想找出 'Avg.每个会话的前半部分和后半部分的难度级别”,我找不到解决这个问题的合适方法。 我使用纪元时间将会话分成两半,然后找到平均难度级别。
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)。
代码方面我不知道从哪里开始。 (Noobie 警报)
我希望输出如下:
session_id 前半段难度后半段难度
【问题讨论】:
【参考方案1】:IIUC,您可以使用 pandas.qcut
将 epoch 切割成 2 个大小相同的 bin(前半部分/后半部分)。然后使用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 的不同时间段,您可能首先必须按 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)
【讨论】:
谢谢。它确实有效,但是当我尝试使用 10 个不同的 session_id 时,输出是混乱的。 @RedDragon 我更新了我的答案,我相信如果你需要为每个 session_id 计算不同的时间段,你可能需要嵌套groupby
有没有办法像这样打印 session_id, mean1 , mean2 ?
您可以将labels
参数添加到pd.cut
方法,并从您的groupby 对象中添加unstack
1 级索引。所以...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])
我已经更新了答案,使用 merge
... 让我知道您是否是这个意思以上是关于如何根据纪元时间获得前半部分和后半部分('attempt updated_at' 列)的主要内容,如果未能解决你的问题,请参考以下文章