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