簡體   English   中英

python pandas - 創建一個保持連續值的運行計數的列

[英]python pandas - creating a column which keeps a running count of consecutive values

我正在嘗試創建一個列(“consec”),它將在不使用循環的情況下在另一個(“二進制”)中保持連續值的運行計數。 這就是期望的結果:

.    binary consec
1       0      0
2       1      1
3       1      2
4       1      3
5       1      4
5       0      0
6       1      1
7       1      2
8       0      0

但是,這......

df['consec'][df['binary']==1] = df['consec'].shift(1) + df['binary']

導致這...

.  binary   consec
0     1       NaN
1     1       1
2     1       1
3     0       0
4     1       1
5     0       0
6     1       1
7     1       1
8     1       1
9     0       0

我看到其他帖子使用分組或排序,但不幸的是,我看不出這對我有用。 在此先感謝您的幫助。

您可以使用compare-cumsum-groupby模式(我真的需要編寫文檔),並使用最終的cumcount

>>> df = pd.DataFrame({"binary": [0,1,1,1,0,0,1,1,0]})
>>> df["consec"] = df["binary"].groupby((df["binary"] == 0).cumsum()).cumcount()
>>> df
   binary  consec
0       0       0
1       1       1
2       1       2
3       1       3
4       0       0
5       0       0
6       1       1
7       1       2
8       0       0

這是有效的,因為首先我們得到我們想要重置計數器的位置:

>>> (df["binary"] == 0)
0     True
1    False
2    False
3    False
4     True
5     True
6    False
7    False
8     True
Name: binary, dtype: bool

這些累積總和為我們提供了每個組的不同ID:

>>> (df["binary"] == 0).cumsum()
0    1
1    1
2    1
3    1
4    2
5    3
6    3
7    3
8    4
Name: binary, dtype: int64

然后我們可以將它傳遞給groupby並使用cumcount在每個組中獲得增加的索引。

對於那些最終在這里尋找“被誤解”版本的答案的人:要重置二進制列中每個更改的計數,以便consec “保持連續值的運行計數”,以下似乎可行:

df["consec2"] = df["binary"].groupby((df["binary"] <> df["binary"].shift()).cumsum()).cumcount()

在此輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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