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

标签 python pandas datetime

我有一个以日期时间作为索引的数据框和 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 过滤器,您可以使用 groupbydiff 来查找连续系列并将它们分配到同一组中,然后您就有了这个组 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/

相关文章:

python - 在 Pandas 中,如何使用具有相似索引的另一个数据框中的值修补具有缺失值的数据框?

java - 如何将当前 UTC 时间转换为 Unix 时间戳

python - 如何让 python datetime.strptime 考虑传递的时区?

python字典更新方法

python - 带有关键字参数的 PyObject_CallMethod

python - make 在 make 调用期间找不到 OpenCV 库

javascript - 从 JavaScript 中的字符串检测夏令时时区

python - 通过管道将sample_weight参数与XGBoost结合使用

python - 模块化代码 python 时未知的库

python - Pandas:将组标题移动到新列