我这里有一个数据集-https://docs.google.com/spreadsheets/d/e/2PACX-1vSBxKr2RNSNBt1WLWyqnoBKFPI2YvACVqZpqmmdIR5buI2lF3I76Ta3rIoiirHkxin6guH_ywGsPzc1/pub?gid=1429325005&single=true&output=csv

如果该"location"的"date"落在该位置的"risk_from"和"risk_to"日期之间,我想将特征"warning"设为Y。如果不是,则"warning"必须为N。

像这样:

location    case     date       risk_from   risk_to warning
A                   2/1/2021                            N
A         Confirmed 2/2/2021    2/2/2021    2/4/2021    Y
A                   2/3/2021                            Y
A         Confirmed 2/4/2021    2/4/2021    2/6/2021    Y
A                   2/5/2021                            Y
A                   2/6/2021                            Y
A                   2/7/2021                            N
B         Confirmed 2/8/2021    2/8/2021    2/10/2021   Y
B                   2/9/2021                            Y
B                   2/10/2021                           Y
B                   2/11/2021                           N
B                   2/12/2021                           N

我试图找到risk_from和risk_to日期的范围,并将它们组合在一起。之后,我尝试检查每个当前日期。如果它们在集合中,则警告为"Y",如果不是,则警告为“ N". I可以使用此答案这里找到日期之间的范围,但我无法实现我想要的。因此,请寻求专家的建议。

分析解答

读取CSV文件时,请使用parse_dates参数。填写缺失的风险列值,然后将它们与日期列进行比较。

risk_cols = ['risk_from', 'risk_to']
df = pd.read_csv('Book1 - Book1.csv', parse_dates=['date'] + risk_cols)

df[risk_cols] = df.groupby('location')[risk_cols].apply(lambda x: x.ffill().bfill())

df['warning_out'] = np.where(df.date.between(df.risk_from, df.risk_to), 'Y', 'N')

输出

   location       case       date  risk_from    risk_to warning warning_out
0         A        NaN 2021-02-01 2021-02-02 2021-02-04       N           N
1         A  Confirmed 2021-02-02 2021-02-02 2021-02-04       Y           Y
2         A        NaN 2021-02-03 2021-02-02 2021-02-04       Y           Y
3         A  Confirmed 2021-02-04 2021-02-04 2021-02-06       Y           Y
4         A        NaN 2021-02-05 2021-02-04 2021-02-06       Y           Y
5         A        NaN 2021-02-06 2021-02-04 2021-02-06       Y           Y
6         A        NaN 2021-02-07 2021-02-04 2021-02-06       N           N
7         B  Confirmed 2021-02-08 2021-02-08 2021-02-10       Y           Y
8         B        NaN 2021-02-09 2021-02-08 2021-02-10       Y           Y
9         B        NaN 2021-02-10 2021-02-08 2021-02-10       Y           Y
10        B        NaN 2021-02-11 2021-02-08 2021-02-10       N           N
11        B        NaN 2021-02-12 2021-02-08 2021-02-10       N           N