假设我有一个像[0,0,0,1,0,0,1,0]
这样的列表。
每当迭代器遇到1时,包含1的先前列表就会分配给一个事件。这一直持续到遇到下一个1。 因此,在这种情况下,有2个事件。
但是如果列表类似于[0,0,1,1,0,0,1]
,由于将连续的1一起考虑,因此这仍将算作2个事件。
到目前为止,我不包括[1,0,0,1]
之类的情况。
可以创建一个新列以反映左边的0或1属于哪个事件,例如事件1或事件2等。
我发现一些使用zip
的方法,但是我的情况有所不同。我该如何处理?
答案 0 :(得分:1)
您可以只使用itertools.groupby
import itertools
l=[0,0,1,1,0,0,1]
[list(y)[0]==1 for x , y in itertools.groupby(l)]
Out[853]: [False, True, False, True]
sum([list(y)[0]==1 for x , y in itertools.groupby(l)])
Out[854]: 2
答案 1 :(得分:1)
IIUC,以定义事件:
下面,我使用(df.c.diff() < 0).cumsum()+1
来标识event_id,并根据是否显示“ 1”来调整最后一个 event_id 组:
import pandas as pd
import numpy as np
l = [0,0,0,1,1,0,0,1,0]
df = pd.DataFrame(l, columns=['c'])
# event_id changes when df.c.diff() < 0
event_id = (df.c.diff() < 0).cumsum()+1
#event_id
#Out[233]:
#0 1
#1 1
#2 1
#3 1
#4 1
#5 2
#6 2
#7 2
#8 3
# the last event_id sequence might not be an event if it does not contain any '1'
m1 = df.groupby(event_id).c.transform(max) == 1
# if you need at least one '0' in an event, then adjust condition to m1&m2 in np.where() and since the first event_id might be skipped thus its calculation should be based on if the first row is an '1'
#event_id = (df.c.diff() < 0).cumsum()+ np.where(df.c.iloc[0]==1,0,1)
#m2 = df.groupby(event_id).c.transform(min) == 0
#df['event'] = np.where(m1&m2, event_id.map('Event-{}'.format), 'Not an event')
df['event'] = np.where(m1, event_id.map('Event-{}'.format), 'Not an event')
# df
# Out[235]:
# c event
#0 0 Event-1
#1 0 Event-1
#2 0 Event-1
#3 1 Event-1
#4 1 Event-1
#5 0 Event-2
#6 0 Event-2
#7 1 Event-2
#8 0 Not an event
注意: df.groupby(event_id).c.transform(max) == 1
表示同一event_id组中至少有一个'1',因此有资格参加活动。