我有一个以日期时间作为索引的数据框和 2 列。
我想要做的是将 df 分成几天, 将这些天分成第 2 列的值等于/高于 70 的 block , 并计算该期间第一列的持续时间(指数)和平均值。
我可以想出一些方法来做到这一点,但其中包括字典和丑陋的循环或来自 itertools 的 groupby,所以我更喜欢更 Pandas 的解决方案。
我已经使用以下方法分割了更大的数据框:for x in df.groupby(pd.Grouper(freq='24H', base=12))
,它将它们分割成发布的 block 下面
2018-04-13 12:00:00 11.4 70.0
2018-04-13 13:00:00 11.3 73.0
2018-04-13 14:00:00 10.6 70.0
2018-04-13 15:00:00 11.2 67.0
2018-04-13 16:00:00 10.4 67.0
2018-04-13 17:00:00 10.8 66.0
2018-04-13 18:00:00 10.8 67.0
2018-04-13 19:00:00 10.8 67.0
2018-04-13 20:00:00 10.7 69.0
2018-04-13 21:00:00 10.3 70.0
2018-04-13 22:00:00 10.1 71.0
2018-04-13 23:00:00 9.8 73.0
2018-04-14 00:00:00 9.4 75.0
2018-04-14 01:00:00 9.1 77.0
2018-04-14 02:00:00 8.6 80.0
2018-04-14 03:00:00 7.8 84.0
2018-04-14 04:00:00 7.3 87.0
2018-04-14 05:00:00 8.3 87.0
2018-04-14 06:00:00 8.3 88.0
2018-04-14 07:00:00 8.6 88.0
2018-04-14 08:00:00 9.0 87.0
2018-04-14 09:00:00 11.3 83.0
2018-04-14 10:00:00 12.2 81.0
2018-04-14 11:00:00 12.4 82.0
我需要:(不是这种格式,只是示例)
2018-04-13 12:00:00 - 3 hours - 71.0
2018-04-13 21:00:00 - 14 hours - 80.86
对于这个问题有什么干净的建议吗?它有点与this相关。 ,但我无法将其转换为我的示例。
我还考虑过过滤掉第 2 列 < 70 的位置,但是我很难再次获得连续性
编辑:我的最终解决方案
df['Time'] = df.index
for day, daydf in df.groupby(pd.Grouper(freq='24H', base=12)):
df_filtered = daydf[daydf['v2'] >= 70]
grouping_key = df_filtered.Time.diff().dt.total_seconds().ne(3600).cumsum()
grouper = df_filtered.groupby(grouping_key)
aggregated_data = grouper.agg({'Time': 'first', 'v1': 'mean', 'v2': len})
print(aggregated_data)
最佳答案
使用 after 过滤器,您可以使用 groupby
和 diff
来查找连续系列并将它们分配到同一组中,然后您就有了这个组 key ,我们可以使用 groupby
+ agg
s.groupby(s.Time.diff().dt.total_seconds().ne(3600).cumsum()).agg({'Time':'first','v2':'mean','v1':len})
Out[701]:
Time v2 v1
Time
1 2018-04-13 12:00:00 71.000000 3.0
2 2018-04-13 21:00:00 71.333333 3.0
数据输入
Time,v1,v2
2018-04-13 12:00:00,11.4,70.0
2018-04-13 13:00:00,11.3,73.0
2018-04-13 14:00:00,10.6,70.0
2018-04-13 15:00:00,11.2,67.0
2018-04-13 16:00:00,10.4,67.0
2018-04-13 17:00:00,10.8,66.0
2018-04-13 18:00:00,10.8,67.0
2018-04-13 19:00:00,10.8,67.0
2018-04-13 20:00:00,10.7,69.0
2018-04-13 21:00:00,10.3,70.0
2018-04-13 22:00:00,10.1,71.0
2018-04-13 23:00:00,9.8,73.0
关于python - 使用连续高于 x 的列值将 pandas df 分成组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49881398/