簡體   English   中英

如何識別連續相同的值 pandas

[英]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.

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