Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫按时间和条件分组_Python_Pandas_Pandas Groupby - Fatal编程技术网

Python 熊猫按时间和条件分组

Python 熊猫按时间和条件分组,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我有一个数据帧,我正试图创建基于两个条件的子事件ID-时间和标志。标志是当人员>=600时,创建一个新的子组 数据如下所示: | event_id | timestamp | people | | abc | 12:00 | 1 | | abc | 12:01 | 3 | | abc | 12:02 | 5 | | abc |

我有一个数据帧,我正试图创建基于两个条件的子事件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   |  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     |
因此,它需要某种分组方式来解释不同的事件ID(这里是abc和xyz,但我的真实数据集中有数百万个)。数据是按时间顺序排列的,在确定分组时,行顺序很重要-两个标志之间的事件id的行位于一个子组中。每个子组都属于一个事件id,并且子组的计数将针对新的事件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

然后你只需要把它分配回来

这正是我所需要的——它可以推广到ABC以上的子组这一事实也是我所需要的,但在问题中没有说明。。。感谢您阅读我的想法并快速回答:D这个答案也很完美,但我接受了另一个,因为我需要的不仅仅是A/B/C子组,但在问题中没有说明这一点。这是我的错,但你的回答很好,我认为这对那些需要指定“卡车”、“汽车”、“飞机”等特定名称的人会有帮助。@LoisKeller;-)祝您有个美好的一天