我有一个这样的数据框:
时间戳记 | 值 | ID。 |
---|---|---|
2020-12-16 | 25 | 1个 |
2020-12-17 | 45 | 1个 |
2020-12-31 | 40 | 1个 |
2021-01-31 | 37 | 1个 |
2020-12-15 | 12 | 2 |
2020-12-16 | 78。 | 2。 |
我想创建一个新列outcome
,该列的值yes
是id
最近25天没有任何条目。例如,这是预期的输出
时间戳记 | 值 | ID。 | 结果 |
---|---|---|---|
2020-12-16 | 25 | 1个 | 是 |
2020-12-17 | 45 | 1个 | 是。 |
2020-12-31 | 40 | 1个 | 是。 |
2021-01-31 | 37 | 1个 | 没有。 |
2020-12-15 | 12 | 2 | 是。 |
2020-12-16 | 78。 | 2。 | 是。 |
在上面的示例中,我们可以假设开始日期为2020-12-15
。因此,我们的比较开始于该日期之后的所有id
。对于id 1
,从开始2020-12-15
,它在last 25 days
之外具有条目2021-01-31
。在此之前发生的入口2021-01-31
是2020-12-31
这是> 25 days
在这个例子。因此,outcome
变量取一个值no
。对于其余的行,这是yes
因为对于每个日期,都有一个在25天差异之内的先前条目。
我对如何为此编写算法感到非常困惑。
我会groupby
id
,order by
timestamp
然后做rolling
的事timestamp
创建outcome
列?
我对此感到非常困惑,任何帮助将不胜感激!
提前致谢!
由于您的计算需要排序,因此我们可以避免分组。排序,采取行差和使用where
到NaN
的值交叉基团(即对每个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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句