考虑以下pandas系列:
import pandas as pd s = pd.Series([0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1])
我想确定第一个值为1的块。当0第一次切换到1时,块开始,当它切换回来时结束(不必)。其余的应该等于零。一个限制:不允许迭代,只允许纯pandas。预期输出:
s_new = pd.Series([0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0])
xxe27gdn1#
您可以通过首先识别0后面的1 s,计算cumsum并保持块等于1来识别1的第一块:
0
1
cumsum
out = s.where(s.diff().eq(1).cumsum().eq(1), 0)
输出:
0 0 1 0 2 0 3 1 4 1 5 1 6 1 7 0 8 0 9 0 10 0 11 0 12 0 13 0 14 0 15 0 dtype: int64
中间体:
s diff eq(1) cumsum 0 0 NaN False 0 1 0 0.0 False 0 2 0 0.0 False 0 3 1 1.0 True 1 4 1 0.0 False 1 5 1 0.0 False 1 6 1 0.0 False 1 7 0 -1.0 False 1 8 1 1.0 True 2 9 0 -1.0 False 2 10 0 0.0 False 2 11 1 1.0 True 3 12 1 0.0 False 3 13 1 0.0 False 3 14 0 -1.0 False 3 15 1 1.0 True 4
1条答案
按热度按时间xxe27gdn1#
您可以通过首先识别
0
后面的1
s,计算cumsum
并保持块等于1
来识别1
的第一块:输出:
中间体: