Python 3.x 使用python在数据集中进行模式识别
我有一个看起来像这样的数据框:Python 3.x 使用python在数据集中进行模式识别,python-3.x,pandas,numpy,dataframe,pattern-matching,Python 3.x,Pandas,Numpy,Dataframe,Pattern Matching,我有一个看起来像这样的数据框: empl_ID day_1 day_2 day_3 day_4 day_5 day_6 day_7 day_8 day_9 day_10 1 1 1 1 1 1 1 0 1 1 1 2 0 0 1 1 1 1 1 1 1 0 3
empl_ID day_1 day_2 day_3 day_4 day_5 day_6 day_7 day_8 day_9 day_10
1 1 1 1 1 1 1 0 1 1 1
2 0 0 1 1 1 1 1 1 1 0
3 0 1 0 0 1 1 1 1 1 1
4 1 0 1 0 1 1 1 0 1 0
5 1 0 0 1 1 1 1 1 1 1
6 0 0 0 0 1 1 1 1 1 1
empl_ID day_1 day_2 day_3 day_4 day_5 day_6 day_7 day_8 day_9 day_10 label
1 1 1 1 1 1 1 0 1 1 1 0
2 0 0 1 1 1 1 1 1 1 0 0
3 0 1 0 0 1 1 1 1 1 1 1
4 1 0 1 0 1 1 1 0 1 0 0
5 1 0 0 1 1 1 1 1 1 1 1
6 0 0 0 0 1 1 1 1 1 1 0
正如我们可以看到的,我们有6名员工,索引1表示他们当天的存在。我想用Python编写一个代码,这样我就可以跟踪2次连续缺勤,即模式0,第一天为0,第一天为1+1,时间范围为6天,从员工开始工作开始算起
例如,员工1从day_1列开始工作,这是他第一次出现1。因此,从第1天到第6天的列中,如果我们没有观察到任何连续的0,0,则该记录应标记为“0”。员工2(cols:day_3至day_8)、员工4(cols:day_1至day_6)和员工6(cols:day_5至day_10)的情况也是如此,它们将被标记为“0”
但是,对于员工3(cols:day_2至day_7)、员工6(cols:day_5至day_10),他们在各自的时间范围内第一次出现1时就包含0,0模式,因此将标记为“1”
如果有人能帮助我制定一套代码来实现上述目标,那将非常有帮助。提前谢谢
结果应该如下所示:
empl_ID day_1 day_2 day_3 day_4 day_5 day_6 day_7 day_8 day_9 day_10
1 1 1 1 1 1 1 0 1 1 1
2 0 0 1 1 1 1 1 1 1 0
3 0 1 0 0 1 1 1 1 1 1
4 1 0 1 0 1 1 1 0 1 0
5 1 0 0 1 1 1 1 1 1 1
6 0 0 0 0 1 1 1 1 1 1
empl_ID day_1 day_2 day_3 day_4 day_5 day_6 day_7 day_8 day_9 day_10 label
1 1 1 1 1 1 1 0 1 1 1 0
2 0 0 1 1 1 1 1 1 1 0 0
3 0 1 0 0 1 1 1 1 1 1 1
4 1 0 1 0 1 1 1 0 1 0 0
5 1 0 0 1 1 1 1 1 1 1 1
6 0 0 0 0 1 1 1 1 1 1 0
使用idxmcx检查,并使用shift检查循环
s=df.set_index('empl_ID')
idx=s.columns.get_indexer(s.idxmax(1))
l=[(s.iloc[t, x :y].eq(s.iloc[t, x :y].shift())&s.iloc[t, x :y].eq(0)).any() for t , x ,y in zip(df.index,idx,idx+5)]
df['Label']=l
df
empl_ID day_1 day_2 day_3 day_4 ... day_7 day_8 day_9 day_10 Label
0 1 1 1 1 1 ... 0 1 1 1 False
1 2 0 0 1 1 ... 1 1 1 0 False
2 3 0 1 0 0 ... 1 1 1 1 True
3 4 1 0 1 0 ... 1 0 1 0 False
4 5 1 0 0 1 ... 1 1 1 1 True
5 6 0 0 0 0 ... 1 1 1 1 False
[6 rows x 12 columns]