嗨,我在计算/标记前11天的日期方面有问题(不管是重复的还是失踪的)。
当我在‘Day_mark’列中找到'1‘时,我需要在前11天(或动态地n天)使用“1”栏中的标签。
下面是我的数据集,所需列是“Day_mark”
例如:在第18行中,我发现了“1”,需要对前11天的工作进行评估。
在第27行,我发现“1”和“nee”来分配前11天的工作,但是我们没有11天的时间限制在第7天。
data = {'Date':['2021-10-4','2021-10-7','2021-10-9','2021-10-10','2021-10-11','2021-10-11','2021-10-12',
'2021-10-12','2021-10-13','2021-10-14','2021-10-15','2021-10-15','2021-10-16','2021-10-16',
'2021-10-17','2021-10-18','2021-10-19','2021-10-20','2021-10-21','2021-11-1','2021-11-2',
'2021-11-3','2021-11-3','2021-11-3','2021-11-5','2021-11-6','2021-11-7','2021-11-8','2021-11-9'],
'Hour':[ 9,11,12,13,5,7,2,20,21,23,1,2,5,7,15,16,17,1,12,13,5,7,2,20,21,23,16,17,13],
'Mark':[ '','','','','','','','','','','','','','','','','',1,'','','','','','','','',1,'',''],
'Day_mark':['','','d11','d10','d9','d9','d8','d8','d7','d6','d5','d5','d4','d4','d3','d2','d1','d7',
'd6','d5','d4','d3','d3','d3','d2','d1',' ',' ',' ']
}提前感谢
发布于 2021-12-17 07:34:54
首先使用比较1按移位掩码创建组列,然后按iloc更改顺序,然后添加累积和,然后通过DataFrame.drop_duplicates删除重复项,然后按GroupBy.cumcount添加计数器,然后使用GroupBy.ffill,如果在最后一个1之后删除最后一行的1,11之间没有匹配,则使用GroupBy.ffill并设置空字符串。
df['g'] = df['Mark'].eq(1).shift(-1).iloc[::-1].cumsum().iloc[::-1]
df['new'] = df.drop_duplicates('Date').groupby('g').cumcount(ascending=False).add(1)
s = df.groupby('g')['new'].ffill().fillna(0).astype(int)
df['new'] = np.where(df['g'].gt(0) & s.between(1,11), 'd' + s.astype(str), '')
df = df.drop('g', axis=1)print (df)
Date Hour Mark Day_mark new
0 2021-10-4 9
1 2021-10-7 11
2 2021-10-9 12 d11 d11
3 2021-10-10 13 d10 d10
4 2021-10-11 5 d9 d9
5 2021-10-11 7 d9 d9
6 2021-10-12 2 d8 d8
7 2021-10-12 20 d8 d8
8 2021-10-13 21 d7 d7
9 2021-10-14 23 d6 d6
10 2021-10-15 1 d5 d5
11 2021-10-15 2 d5 d5
12 2021-10-16 5 d4 d4
13 2021-10-16 7 d4 d4
14 2021-10-17 15 d3 d3
15 2021-10-18 16 d2 d2
16 2021-10-19 17 d1 d1
17 2021-10-20 1 1 d7 d7
18 2021-10-21 12 d6 d6
19 2021-11-1 13 d5 d5
20 2021-11-2 5 d4 d4
21 2021-11-3 7 d3 d3
22 2021-11-3 2 d3 d3
23 2021-11-3 20 d3 d3
24 2021-11-5 21 d2 d2
25 2021-11-6 23 d1 d1
26 2021-11-7 16 1
27 2021-11-8 17
28 2021-11-9 13 另一个dea是比较每个组的最后日期并减去,但是输出是不同的:
df['Date'] = pd.to_datetime(df['Date'])
df['g'] = df['Mark'].eq(1).shift(-1).iloc[::-1].cumsum().iloc[::-1]
df['new'] = (df.groupby('g')['Date']
.transform('last')
.sub(df['Date'])
.dt.days
.add(1)
.fillna(0)
.astype(int))
df['new'] = np.where(df['g'].gt(0) & df['new'].le(11), 'd' + df['new'].astype(str), '')
df = df.drop('g', axis=1)print (df)
Date Hour Mark Day_mark new
0 2021-10-04 9
1 2021-10-07 11
2 2021-10-09 12 d11 d11
3 2021-10-10 13 d10 d10
4 2021-10-11 5 d9 d9
5 2021-10-11 7 d9 d9
6 2021-10-12 2 d8 d8
7 2021-10-12 20 d8 d8
8 2021-10-13 21 d7 d7
9 2021-10-14 23 d6 d6
10 2021-10-15 1 d5 d5
11 2021-10-15 2 d5 d5
12 2021-10-16 5 d4 d4
13 2021-10-16 7 d4 d4
14 2021-10-17 15 d3 d3
15 2021-10-18 16 d2 d2
16 2021-10-19 17 d1 d1
17 2021-10-20 1 1 d7
18 2021-10-21 12 d6
19 2021-11-01 13 d5 d6
20 2021-11-02 5 d4 d5
21 2021-11-03 7 d3 d4
22 2021-11-03 2 d3 d4
23 2021-11-03 20 d3 d4
24 2021-11-05 21 d2 d2
25 2021-11-06 23 d1 d1
26 2021-11-07 16 1
27 2021-11-08 17
28 2021-11-09 13 https://stackoverflow.com/questions/70389549
复制相似问题