[英]Pandas - How to count consecutive Falses since the last occurence of True in a time series without looping?
对于给定的问题,是否有使用 Pandas 的 Pythonic 解决方案?
假设我屏蔽了名为 A 的系列
[False, True, False, False, False, True, False, False]
我想得到一个自上次出现 True 以来计算 False 值的系列。 对于上面的示例,这将输出如下内容:
[NaN, 0, 1, 2, 3, 0, 1, 2]
作为奖励也总结为:
[NaN, 3, 2]
仅包含 True 值之后所有连续出现的 False 值的最大长度。
非常感谢
德拉吉
尝试这个
out = (~A).cumsum() - (~A).cumsum().where(A).ffill()
Out[1372]:
0 NaN
1 0.0
2 1.0
3 2.0
4 3.0
5 0.0
6 1.0
7 2.0
dtype: float64
如果你想获得总和,从这个尝试out
上述
out_sum = out[A.shift(-1, fill_value=True) & out.ne(0)]
Out[1411]:
0 NaN
4 3.0
7 2.0
dtype: float64
如果您只想使用系列,您可以通过这种方式调整@kiki 的答案:
s = pd.Series([False, True, False, False, False, True, False, False])
(s.groupby(s.cumsum()).count()-1).replace(0,np.nan).tolist()
无论如何,我认为如果您想了解幕后发生的事情,@kiki 的答案会更透明一些
[nan, 3.0, 2.0]
此外,对于完整的系列,它只是:
(s.groupby(s.cumsum()).cumcount())
0 0
1 0
2 1
3 2
4 3
5 0
6 1
7 2
请告诉我在第一行中是否有一个零而不是nan
是一个问题。
我认为 cumsum 函数可以帮助您在每个 True 幻影中创建一种 id。 然后你就可以分组并做你需要的
res = pd.DataFrame([False, True, False, False, False, True, False, False],columns=['val'])
res['cumsum'] = res.val.cumsum()
res.groupby("cumsum").count() - 1
输出:
val
cumsum
0 0
1 3
2 2
改编自@Andy L 对数据框的回答:
df = pd.DataFrame({'values':[False, True, False, False, False, True, False, False]})
df['cumsum'] = (~df['values']).cumsum() - (~df['values']).cumsum().where(df['values']).ffill()
grouped = pd.concat([df.loc[df[df['values']==True].index-1,:],df.tail(1)])
输出:
values cumsum
0 False NaN
1 True 0.0
2 False 1.0
3 False 2.0
4 False 3.0
5 True 0.0
6 False 1.0
7 False 2.0
分组输出:
values cumsum
0 False NaN
4 False 3.0
7 False 2.0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.