python - 如果事件发生在某个时间窗口( future 或过去),则创建新的列

标签 python pandas

我有一个具有以下结构的 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 的地方),但我被卡住了

最佳答案

您可以使用 groupbyrolling 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/

相关文章:

python - 如何计算每个季节有多少天的答案等于 pandas 数据框中的不同数字?

python - 在 Pandas 数据帧中隐式将字节转换为字符串(Python 3.6)

python - 将 JSON 对象的一部分存储在 pandas df 中

python - Pandas:列和索引之间的多索引应用功能

python - pandas 列值和变量值字符串连接

python - 结合 Pandas 的 startwith 和 isin

python - 在django开发环境下使用Docker、Gunicorn、Nginx却只能看到nginx欢迎页面?

python - 临时目录在程序运行期间持续存在

python - Django 模型父链接的自定义相关名称?

python - Pandas如何将列按日期时间移动到不在索引中的日期时间