簡體   English   中英

Pandas 將時間序列 dataframe 展平到相同的活動但不同的時間戳

[英]Pandas flatten a time-series dataframe on same activity but different timestamps

我希望扁平化某些流程。 基本上是查看彼此緊隨其后的重復項。 假設我有一個 dataframe:

d = {'time': [12-08-2020, 13-08-2020, 14-08-2020, 15-08-2020, 16-08-2020], 'state': [off, on, on, on, off]}
df = pd.DataFrame(data=d)

然后我會使用time.shift()來創建“time_end”列。 基本上是下排時間。 結果:

         time state    time_end
0  12-08-2020   off  13-08-2020
1  13-08-2020    on  14-08-2020
2  14-08-2020    on  15-08-2020
3  15-08-2020    on  16-08-2020
4  16-08-2020   off         NaN

我現在的問題是,如何將它展平,使其實際上變成這樣的 3 行:

         time state    time_end
0  12-08-2020   off  13-08-2020
1  13-08-2020    on  16-08-2020
4  16-08-2020   off         NaN

對於我的代碼,如果它們后面跟着另一個,我不需要重復。 任何幫助,將不勝感激。

我們可以通過.shift() + .ne() + .cumsum()得到連續相同的state的分組。

然后,對於每個組(連續相同的state ),我們使用.groupby() + .agg()獲得time的第一個條目和time_end的最后一個條目,如下所示:

df['state_group'] = df['state'].ne(df['state'].shift()).cumsum()

df_out = df.groupby('state_group').agg({'time': 'first', 'state': 'first', 'time_end': 'last'}).reset_index(drop=True)

結果:

print(df_out)

         time state    time_end
0  12-08-2020   off  13-08-2020
1  13-08-2020    on  16-08-2020
2  16-08-2020   off        None

僅供參考,以下臨時 dataframe 是在上述第一行代碼之后對連續相同的state進行分組創建的。 我們基於此分組來聚合所需的扁平化結果。

         time state    time_end  state_group
0  12-08-2020   off  13-08-2020            1
1  13-08-2020    on  14-08-2020            2
2  14-08-2020    on  15-08-2020            2
3  15-08-2020    on  16-08-2020            2
4  16-08-2020   off         NaN            3

我們可以根據當前行的state值不等於下一行的state值來過濾 DataFrame,然后通過向后移回過濾后的time列來創建time_end列:

import pandas as pd

df = pd.DataFrame(data={
    'time': ['12-08-2020', '13-08-2020', '14-08-2020', '15-08-2020',
             '16-08-2020'],
    'state': ['off', 'on', 'on', 'on', 'off']
})

new_df = df[df['state'].ne(df['state'].shift())].reset_index(drop=True)
new_df['time_end'] = new_df['time'].shift(-1)

new_df :

         time state    time_end
0  12-08-2020   off  13-08-2020
1  13-08-2020    on  16-08-2020
2  16-08-2020   off         NaN

暫無
暫無

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

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