考虑以下系列
s = pd.Series([0,1,2,3,4,1,5,4,3,2,1])
是否有一种简单的方法可以知道达到/超过2值的次数(没有明显的迭代解决方案)?
上述示例的预期结果应为4(系列中的2行向上或向下划分4次)。
编辑:更新了示例案例
答案 0 :(得分:5)
使用Series.shift
method可以轻松实现这一点。因为你只需要向前看就知道数字是否已经越过。
s = pd.Series([0,1,2,3,4,1,5,4,3,2,1])
df = pd.DataFrame({'s':s})
df['next_s'] = df.s.shift(-1)
line = 2
df
s next_s
0 0 1
1 1 2
2 2 3
3 3 4
4 4 1
5 1 5
6 5 4
7 4 3
8 3 2
9 2 1
10 1 NaN
现在您可以使用简单的可向量化条件语句
df['cross'] = (
((df.s >= line) & (df.next_s < line)) |
((df.next_s > line) & (df.s <= line)) |
(df.s == line))
df
s next_s cross
0 0 1 False
1 1 2 False
2 2 3 True
3 3 4 False
4 4 1 True
5 1 5 True
6 5 4 False
7 4 3 False
8 3 2 False
9 2 1 True
10 1 NaN False
现在很容易总结布尔值来计算:
df.cross.sum()
4