我有一个具有以下结构的 Pandas 数据框:
ID date e_1
1 2016-02-01 False
2016-02-02 False
2016-02-03 True
2016-02-04 False
2016-02-05 False
2016-02-06 False
2016-02-07 False
2016-02-08 False
2016-02-09 False
2016-02-10 False
2 2016-02-01 False
2016-02-02 True
2016-02-03 True
2016-02-04 False
... ...
我想添加几个编码以下内容的列:Does the e_1
is True
in the following 1d
, 2d
, 3d
, 4d
, 5d
, 1 month
...等?
我想在列表中及时指定增量。列的名称将是 e1_XX
,其中 XX
是增量(即 1d
等)
我尝试使用 shift
但这只会移动值。还尝试了 rolling
(它似乎更适合这个任务):
df.groupby('ID').rolling(3).agg(???)
但我不知道如何通过条件(我虽然在类似 np.any
的地方),但我被卡住了
最佳答案
您可以使用 groupby
与 rolling
apply
df.groupby('ID').e_1.apply(lambda x : x.iloc[::-1].rolling(window=3,min_periods=1).apply(any).iloc[::-1].astype(bool))
Out[51]:
ID date
1 2016-02-01 True
2016-02-02 True
2016-02-03 True
2016-02-04 False
2016-02-05 False
2016-02-06 False
2016-02-07 False
2016-02-08 False
2016-02-09 False
2016-02-10 False
2 2016-02-01 True
2016-02-02 True
2016-02-03 True
2016-02-04 False
Name: e_1, dtype: bool
编辑:groupby
索引 ID,然后每个 ID 都有一系列 e_1,并检查 link对于滚动,它可以接受偏移量,这意味着当您的索引是日期时间时,它可以使用 offset
(3d表示3天)确定窗口大小
df.groupby('ID').e_1.apply(lambda x : x.reset_index(level=0,drop=True).rolling('3d').apply(any))
更新,我们需要创建另一个列来帮助,这个逻辑等于 [::-1],但是当你使用时间索引时:索引必须是单调的强>
df['New']=pd.to_datetime('today')+(pd.to_datetime('today')-df.index.get_level_values(1))
df=df.sort_index(level=0).sort_values('New')
df['New']=df.groupby('ID',sort=False).apply(lambda x : x.reset_index(drop=True).set_index('New')['e_1'].rolling('3d',min_periods=1).apply(any)).sort_index(level=1).values.astype(bool)
df.sort_index()
Out[278]:
e_1 New
ID date
1 2016-02-01 False True
2016-02-02 False True
2016-02-03 True True
2016-02-04 False False
2016-02-05 False False
2016-02-06 False False
2016-02-07 False False
2016-02-08 False False
2016-02-09 False False
2016-02-10 False False
2 2016-02-01 False True
2016-02-02 True True
2016-02-03 True True
2016-02-04 False False
关于python - 如果事件发生在某个时间窗口( future 或过去),则创建新的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49973183/