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