首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据条件分配前n天的标签

根据条件分配前n天的标签
EN

Stack Overflow用户
提问于 2021-12-17 07:11:15
回答 1查看 36关注 0票数 -1

嗨,我在计算/标记前11天的日期方面有问题(不管是重复的还是失踪的)。

当我在‘Day_mark’列中找到'1‘时,我需要在前11天(或动态地n天)使用“1”栏中的标签。

下面是我的数据集,所需列是“Day_mark”

例如:在第18行中,我发现了“1”,需要对前11天的工作进行评估。

在第27行,我发现“1”和“nee”来分配前11天的工作,但是我们没有11天的时间限制在第7天。

代码语言:javascript
运行
复制
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',' ',' ',' ']
}

提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-17 07:34:54

首先使用比较1按移位掩码创建组列,然后按iloc更改顺序,然后添加累积和,然后通过DataFrame.drop_duplicates删除重复项,然后按GroupBy.cumcount添加计数器,然后使用GroupBy.ffill,如果在最后一个1之后删除最后一行的1,11之间没有匹配,则使用GroupBy.ffill并设置空字符串。

代码语言:javascript
运行
复制
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)

代码语言:javascript
运行
复制
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是比较每个组的最后日期并减去,但是输出是不同的:

代码语言:javascript
运行
复制
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)

代码语言:javascript
运行
复制
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                 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70389549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档