首页 > 解决方案 > 如何在 Pandas 中进行累积分组直到特定条件中断?

问题描述

我有一个数据如下:

    User    Activity    Time(In Mins)
0   1       A           2.00
1   1       B           1.00
2   1       C           1.20
3   1       D           3.00
4   1       A           7.20
5   1       D           0.47
6   1       B           10.00
7   2       A           4.00
8   2       B           6.00
9   2       C           10.00
10  2       F           1.00
11  2       G           2.50

我想参加会议:1 个会议由多项活动组成。如果某些活动超过 5 分钟,则会话中断,之后我必须计算另一个会话。

我有十万的数据,所以我想要最快的方法

所需的输出:

    User    Activity    Time(In Mins)  Session
0   1       A           2.00           1
1   1       B           1.00           1
2   1       C           1.20           1
3   1       D           3.00           1
4   1       A           7.20           1
5   1       D           0.47           2          
6   1       B           10.00          2
7   2       A           4.00           1
8   2       B           6.00           1
9   2       C           10.00          2
10  2       F           1.00           3
11  2       G           2.50           3

标签: pythonpython-3.xpandaspython-requestspandas-groupby

解决方案


使用布尔掩码。首先,找到所有大于 300 秒的值,然后按用户和 分组cumsum。最后,添加 1 并根据您的预期结果移动所有值:

mask = (df['Time(In Mins)'] // 1 * 60) + (df['Time(In Mins)'] % 1 * 100) > 5 * 60
df['Session'] = mask.groupby(df['User']).cumsum().add(1).shift(fill_value=1)
>>> df
    User Activity  Time(In Mins)  Session
0      1        A           2.00        1
1      1        B           1.00        1
2      1        C           1.20        1
3      1        D           3.00        1
4      1        A           7.20        1
5      1        D           0.47        2
6      1        B          10.00        2
7      2        A           4.00        3
8      2        B           6.00        1
9      2        C          10.00        2
10     2        F           1.00        3
11     2        G           2.50        3

推荐阅读