使用连续高于x的列值将pandas df拆分成组

时间:2018-04-17 14:56:07

标签: python pandas datetime

我有一个数据框,日期时间为索引,有2列。

我想要做的是将df分成几天, 将那些日子分成第2列的值等于/高于70的块, 并计算该期间第1列的持续时间(指数)和平均值。

我可以想办法做到这一点,但那些包括字典和丑陋的循环或者来自itertools的groupby,所以我更喜欢一种更为自然的解决方案。

我已经使用以下内容拆分我的大型数据框:for x in df.groupby(pd.Grouper(freq='24H', base=12)),将它们拆分为下面发布的chuncks

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)

1 个答案:

答案 0 :(得分:2)

使用过滤后,您可以groupbydiff一起使用,查找续系列并将其分配到同一组,然后您拥有此组密钥,我们可以使用groupby + { {1}}

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