簡體   English   中英

Pandas - 如何在不循環的情況下計算自時間序列中最后一次出現 True 以來的連續 Falses?

[英]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())

輸出 2:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM