![](/img/trans.png)
[英]Identify consecutive same values in Pandas Dataframe, with a Groupby
[英]How to identify consecutive same values pandas
我有這樣的數據名聲:
時間戳 | 價值 |
---|---|
2021-04-21 14:22:00 | 0 |
2021-04-21 14:23:00 | 0 |
2021-04-21 14:24:00 | 0 |
2021-04-21 14:25:00 | 1個 |
2021-04-21 14:26:00 | 1個 |
2021-04-21 14:27:00 | 0 |
2021-04-21 14:28:00 | 1個 |
2021-04-21 14:29:00 | 1個 |
2021-04-21 14:30:00 | 1個 |
我想獲得這樣的連續相同值:
開始日期 | 另一個 header | 連續值 |
---|---|---|
2021-04-21 14:25:00 | 2021-04-21 14:26:00 | 2個 |
2021-04-21 14:28:00 | 2021-04-21 14:30:00 | 3個 |
我嘗試了一些使用 numpy shift 或使用 for / while 循環的解決方案,但它不起作用......另外,我確實在堆棧溢出中看到了一些主題。
謝謝 !
您可以使用自定義groupby.agg
:
# identify rows with value=1
m = df['Value'].eq(1)
# filter, groupby consecutive values
out = (df[m].groupby((~m).cumsum())
# aggregate with first/min, last/max date, and count
.agg(**{'Begin Date': ('Timestamp', 'first'), # or min
'Another header': ('Timestamp', 'last'), # or max
'Consecutive values': ('Timestamp', 'count')})
)
output:
Begin Date Another header Consecutive values
Value
3 2021-04-21 14:25:00 2021-04-21 14:26:00 2
4 2021-04-21 14:28:00 2021-04-21 14:30:00 3
您可以先使用df.diff(1)
和.cumsum()
對值進行分組:
df['group'] = (df.Value.diff(1) != 0).cumsum()
現在我們可以在此列上使用pd.groupby()
來創建新的 dataframe:
out = pd.DataFrame({'Begin Date' : df.groupby('group').Timestamp.first(),
'Another header' : df.groupby('group').Timestamp.last(),
'Consecutive values' : df.groupby('group').size(),
'Value' : df.groupby('group').Value.first()}).reset_index(drop=True)
Output:
Begin Date Another header Consecutive values Value
0 2021-04-21 14:22:00 2021-04-21 14:24:00 3 0
1 2021-04-21 14:25:00 2021-04-21 14:26:00 2 1
2 2021-04-21 14:27:00 2021-04-21 14:27:00 1 0
3 2021-04-21 14:28:00 2021-04-21 14:30:00 3 1
我特意在這里展示完整的結果(包括連續的零)。 如果你想刪除那些你可以通過執行out[out.Value != 0]
來過濾
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.