如果在过去N天内满足条件,则创建新列

2024-05-05 02:44:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个数据帧:

^{tb1}$

我想创建一个新列outcome,它接受一个值yes,因为id在过去25天内没有任何条目。 例如,这是预期输出

^{tb2}$

在上面的示例中,我们可以假设开始日期为2020-12-15。因此,我们对所有id的比较都是在这个日期之后开始的。 对于id 1,从2020-12-15开始,除了2021-01-31之外,它在last 25 days中有条目。发生在2021-01-31之前的条目位于2020-12-31上,在本例中> 25 days。因此,outcome变量取值no。对于其余的行,它是yes,因为对于每一个日期,都有一个前一个条目在25天的差异范围内

我对如何为此编写算法感到非常困惑

我必须groupby{},order by{},然后在timestamp上做一些事情来创建outcome

我对此感到非常困惑,任何帮助都将不胜感激

提前谢谢


2条回答

在下列情况下适用条件:

1.一组连续天数之间的差值小于15 或 2.组中的第一项等于是。不符合任何条件的任何其他元素等于

import numpy as np
df['outcome']=np.where(df.groupby('id.')['timestamp'].transform('diff').dt.days.lt(15)|~df['id.'].duplicated(keep='first'),'yes','no')



 timestamp  value  id. outcome
0 2020-12-16   25.0  1.0     yes
1 2020-12-17   45.0  1.0     yes
2 2020-12-31   40.0  1.0     yes
3 2021-01-31   37.0  1.0      no
4 2020-12-15   12.0  2.0     yes
5 2020-12-16   78.0  2.0     yes

因为您的计算需要排序,所以我们可以避免分组。排序,获取行差,并使用跨组的值whereNaN(即每个ID的最早行)。因为您希望第一个差异是相对于'2020-12-15'的,所以我们可以使用fillna查找与该日期的差异,并使用np.where根据您的条件为字符串赋值

import pandas as pd
import numpy as np

df['timestamp'] = pd.to_datetime(df['timestamp'])
df = df.sort_values(['id', 'timestamp'])

s = (df['timestamp'].diff()
       .where(df['id'].eq(df['id'].shift()))
       .fillna(df['timestamp'] - pd.to_datetime('2020-12-15')))
#0    1 days
#1    1 days
#2   14 days
#3   31 days
#4    0 days
#5    1 days

df['outcome'] = np.where(s <= pd.Timedelta(25, 'D'), 'yes', 'no')
#   timestamp  value  id outcome
#0 2020-12-16     25   1     yes
#1 2020-12-17     45   1     yes
#2 2020-12-31     40   1     yes
#3 2021-01-31     37   1      no
#4 2020-12-15     12   2     yes
#5 2020-12-16     78   2     yes

相关问题 更多 >