在熊猫中使用倒计时功能可实现倒计时?

Bra*_*rad 6 python pandas

我试图确定如何创建一个“向下计数”的列,直到使用熊猫本质上执行以下功能的另一列中的下一个值出现为止:

rowid  event   countdown
1      False   0 # resets countdown
2      True    2 # resets countdown
3      False   1
4      False   0
5      True    1 # resets countdown
6      False   0
7      True    1 # resets countdown
...
Run Code Online (Sandbox Code Playgroud)

其中,事件列定义了列中的事件是否发生(真)(假)。并且倒数列标识在所述事件发生之前必须发生的后续行/步骤的数量。以下内容适用于何时需要“计数”事件发生的时间:

df.groupby(df.event.cumsum()).cumcount()
Out[46]: 
0    0
1    0
2    1
3    2
4    0
5    1
dtype: int64
Run Code Online (Sandbox Code Playgroud)

但是,这有效地实现了我想要完成的任务的逆,是否有一种实现上述示例的简洁方法,谢谢!

jez*_*ael 4

GroupBy.cumcount与 一起使用ascending=False,有最后一个值0,因为样本数据只有 7 行,并且最后一个值之后没有其他值:

df['new'] =  df.groupby(df.event.cumsum()).cumcount(ascending=False)
print (df)
   rowid  event  countdown  new
0      1  False          0    0
1      2   True          2    2
2      3  False          1    1
3      4  False          0    0
4      5   True          1    1
5      6  False          0    0
6      7   True          1    0
Run Code Online (Sandbox Code Playgroud)

如果逻辑是最后一个,True则需要设置1

df.iloc[[-1], df.columns.get_loc('new')] = int(df.iloc[-1, df.columns.get_loc('event')])
print (df)
   rowid  event  countdown  new
0      1  False          0    0
1      2   True          2    2
2      3  False          1    1
3      4  False          0    0
4      5   True          1    1
5      6  False          0    0
6      7   True          1    1
Run Code Online (Sandbox Code Playgroud)