考虑以下 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 值 block 。该 block 在 0 第一次切换到 1 时开始,并在它切换回 1 时结束(不必如此)。其余的应该等于零。一个限制:不允许迭代,只能使用纯 pandas。
预期输出:
s_new = pd.Series([0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0])
最佳答案
您可以通过首先识别 0
后面的 1
来识别 1
的第一个 block ,然后计算 cumsum
并保持 block 等于1
:
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
关于python - 根据开关值识别 pandas 系列中的第一个 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76238390/