Python 熊猫按时间和条件分组
我有一个数据帧,我正试图创建基于两个条件的子事件ID-时间和标志。标志是当人员>=600时,创建一个新的子组 数据如下所示: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 |
| 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;-)祝您有个美好的一天