我试图确定如何创建一个“向下计数”的列,直到使用熊猫本质上执行以下功能的另一列中的下一个值出现为止:
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)
但是,这有效地实现了我想要完成的任务的逆,是否有一种实现上述示例的简洁方法,谢谢!
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)
| 归档时间: |
|
| 查看次数: |
55 次 |
| 最近记录: |