Python 熊猫-如何在不循环的情况下计算时间序列中最后一次出现“真”后的连续错误数?

Python 熊猫-如何在不循环的情况下计算时间序列中最后一次出现“真”后的连续错误数?,python,pandas,numpy,Python,Pandas,Numpy,对于给定的问题,是否有一个与熊猫有关的pythonic解决方案 假设我有一个叫A的面具系列 [False, True, False, False, False, True, False, False] 我想得到一个序列,它统计自上次出现True以来的False值。对于上面的示例,这将输出如下内容: [NaN, 0, 1, 2, 3, 0, 1, 2] 作为奖金,还包括: [NaN, 3, 2] 仅包含在真值之后所有连续出现的假值的最大长度 事先多谢 draj试试这个 out = (~A).

对于给定的问题,是否有一个与熊猫有关的pythonic解决方案

假设我有一个叫A的面具系列

[False, True, False, False, False, True, False, False]
我想得到一个序列,它统计自上次出现True以来的False值。对于上面的示例,这将输出如下内容:

[NaN, 0, 1, 2, 3, 0, 1, 2]
作为奖金,还包括:

[NaN, 3, 2]
仅包含在真值之后所有连续出现的假值的最大长度

事先多谢

draj

试试这个

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
如果你想得到总和,试试上面的方法


我认为cumsum函数可以帮助您在每个真实的幻影中创建一种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       
    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

如果您只想使用该系列,您可以通过以下方式改编@kiki的答案:

s = pd.Series([False, True, False, False, False, True, False, False])
(s.groupby(s.cumsum()).count()-1).replace(0,np.nan).tolist()
无论如何,我认为,如果你想了解引擎盖下发生的事情,@kiki的回答更为透明

输出: 此外,对于整个系列,它只是:

(s.groupby(s.cumsum()).cumcount())
产出2:
请告诉我第一行是否存在零而不是nan的问题。

来自@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)])
输出:

      val  
cumsum
0       0       
1       3       
2       2       
    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

但这是错误的吗?这是一个总结的答案,我认为这是最重要的结果。我加了三个字母,把它从一点也不接近变成几乎完全符合他的要求。谢谢大家!@德拉杰:不客气。我编辑了答案,添加了一个解决方案来获得sum:这是一个很好的解决方案:+1
    values  cumsum
0    False     NaN
4    False     3.0
7    False     2.0