python - Pandas Group By - 按时间和条件分隔

标签 python pandas pandas-groupby

我有一个数据框,我试图根据两个条件(时间和标志)创建子 event_id。标志是当人 >= 600 时,创建一个新的子组。

数据看起来像这样:

    | event_id   |  timestamp |  people |
    |  abc       |  12:00     |   1     |
    |  abc       |  12:01     |   3     |
    |  abc       |  12:02     |   5     |
    |  abc       |  12:04     |   600   |
    |  abc       |  12:10     |   4     |
    |  abc       |  12:15     |   7     |
    |  abc       |  12:20     |   1700  |
    |  abc       |  12:30     |   1     |
    |  abc       |  12:31     |   1     |
    |  xyz       |  12:32     |   1     |
    |  xyz       |  12:40     |   750   |
    |  xyz       |  12:50     |   1     |

我想要的结果是这样的:

    | event_id   |  timestamp |  people |  subgroup  |
    |  abc       |  12:00     |   1     |      A     |
    |  abc       |  12:01     |   3     |      A     |
    |  abc       |  12:02     |   5     |      A     |
    |  abc       |  12:04     |   600   |      A     |
    |  abc       |  12:10     |   4     |      B     |
    |  abc       |  12:15     |   7     |      B     |
    |  abc       |  12:20     |   1700  |      B     |
    |  abc       |  12:30     |   1     |      C     |
    |  abc       |  12:31     |   1     |      C     |
    |  xyz       |  12:32     |   1     |      A     |
    |  xyz       |  12:40     |   750   |      A     |
    |  xyz       |  12:50     |   1     |      B     |

因此它需要某种分组依据来说明不同的 event_id(此处为 abc 和 xyz,但在我的真实数据集中有数百万个)。数据是按时间排序的,在确定分组时行顺序很重要 - 两个标志之间的 event_id 的行在一个子组中。每个子组都属于一个 event_id,并且子组的计数重新开始以获得新的 event_id。

很想看到任何/所有的想法,我很困惑,但现在正在玩 lambda 函数。

最佳答案

from string import ascii_uppercase

m = dict(enumerate(ascii_uppercase))

def trickery(x):
    c = (x.values >= 600)[::-1].cumsum()[::-1]
    return c.max() - c

df.assign(subgroup=df.groupby('event_id').people.transform(trickery).map(m))

   event_id timestamp  people subgroup
0       abc     12:00       1        A
1       abc     12:01       3        A
2       abc     12:02       5        A
3       abc     12:04     600        A
4       abc     12:10       4        B
5       abc     12:15       7        B
6       abc     12:20    1700        B
7       abc     12:30       1        C
8       abc     12:31       1        C
9       xyz     12:32       1        A
10      xyz     12:40     750        A
11      xyz     12:50       1        B

关于python - Pandas Group By - 按时间和条件分隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47213579/

相关文章:

Python:通过从不同类/线程内建立的 TCP session 发送

python - 删除列表中存在的任何空列表

python - 如何防止 wxPython 子类中的内存泄漏?

python - 应用特定于行的条件的有效方法

python - Pandas-根据列删除重复行

python - Pandas 中的 Groupby、map 和 sum 导致 NaN

python - 向客户端呈现 REST Web 服务界面

python - 如何根据指定行后的位置对 Pandas 数据框进行切片

python - 在对分组对象执行操作并相应地创建变量后索引数据框

python - 从组内的最大值中减去值