【问题标题】:How do I get the first half and second half depending on the epoch time('attempt_updated_at' column)如何根据纪元时间获得前半部分和后半部分('attempt updated_at' 列)
【发布时间】:2023-03-27 10:00:01
【问题描述】:

所以,我想找出 '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 前半段难度后半段难度

【问题讨论】:

    标签: python-3.x pandas epoch


    【解决方案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... 让我知道您是否是这个意思
    猜你喜欢
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 2019-04-05
    • 1970-01-01
    相关资源
    最近更新 更多