Python 如何基于列重新采样/重新索引/分组';谁的数据?

Python 如何基于列重新采样/重新索引/分组';谁的数据?,python,pandas,Python,Pandas,所以我得到了一个熊猫数据框,它以1秒的分辨率包含了2个用水值。值为“热输入”和“热输出”。hotIn可以以1秒的分辨率记录到十分之一加仑,而hotOut则记录代表一加仑的整数脉冲,即当脉冲发生时,一加仑已经通过仪表。脉冲大约每14-15秒出现一次 数据大致如下所示: Index hotIn(gpm) hotOut(pulse=1gal) 2019-03-23T00:00:00 4 0 2019-

所以我得到了一个熊猫数据框,它以1秒的分辨率包含了2个用水值。值为“热输入”和“热输出”。hotIn可以以1秒的分辨率记录到十分之一加仑,而hotOut则记录代表一加仑的整数脉冲,即当脉冲发生时,一加仑已经通过仪表。脉冲大约每14-15秒出现一次

数据大致如下所示:

Index                       hotIn(gpm)      hotOut(pulse=1gal) 
2019-03-23T00:00:00         4               0 
2019-03-23T00:00:01         5               0 
2019-03-23T00:00:02         4               0 
2019-03-23T00:00:03         4               0 
2019-03-23T00:00:04         3               0 
2019-03-23T00:00:05         4               1 
2019-03-23T00:00:06         4               0 
2019-03-23T00:00:07         5               0 
2019-03-23T00:00:08         3               0 
2019-03-23T00:00:09         3               0 
2019-03-23T00:00:10         4               0 
2019-03-23T00:00:11         4               0 
2019-03-23T00:00:12         5               0 
2019-03-23T00:00:13         5               1
Index                       hotIn sum(gpm)      hotOut(pulse=1gal) 
2019-03-23T00:00:05         24                 1 
2019-03-23T00:00:13         32                 1 

我想做的是根据脉冲的出现对数据帧进行重新采样或重新编制索引,并对新时间戳之间的hotIn求和

例如,在00:00:00-00:00:05和00:00:06-00:00:13之间求和hotIn

理想情况下,结果如下所示:

Index                       hotIn(gpm)      hotOut(pulse=1gal) 
2019-03-23T00:00:00         4               0 
2019-03-23T00:00:01         5               0 
2019-03-23T00:00:02         4               0 
2019-03-23T00:00:03         4               0 
2019-03-23T00:00:04         3               0 
2019-03-23T00:00:05         4               1 
2019-03-23T00:00:06         4               0 
2019-03-23T00:00:07         5               0 
2019-03-23T00:00:08         3               0 
2019-03-23T00:00:09         3               0 
2019-03-23T00:00:10         4               0 
2019-03-23T00:00:11         4               0 
2019-03-23T00:00:12         5               0 
2019-03-23T00:00:13         5               1
Index                       hotIn sum(gpm)      hotOut(pulse=1gal) 
2019-03-23T00:00:05         24                 1 
2019-03-23T00:00:13         32                 1 
我已经探索了使用两步for-elif循环,只检查hotOut==1,但在大型数据集上速度非常慢。如果可能的话,熊猫的时间戳功能肯定会更出色。
我也不能简单地在设定的频率上重新采样,因为脉冲之间的间隔是周期性变化的。主要问题是脉冲变化之间的时间戳周期,因此一般的重采样规则不起作用。在提取与脉冲相关联的时间戳并将其作为新索引应用于main时,我也遇到了匹配数据帧长度的问题。

您不想在索引上分组。只要
'hotOut(pulse=1gal)
发生变化,您就要分组

s = df['hotOut(pulse=1gal)'].cumsum().shift().bfill()

(df.reset_index()
   .groupby(s, as_index=False)
   .agg({'Index': 'last', 'hotIn(gpm)': 'sum', 'hotOut(pulse=1gal)': 'last'})
   .set_index('Index'))

IIUC,你可以做:

s = df['hotOut(pulse=1gal)'].shift().ne(0).cumsum()
(df.groupby(s)
   .agg({'Index':'last', 'hotIn(gpm)':'sum'})
   .reset_index(drop=True)
)
输出:

                 Index  hotIn(gpm)
0  2019-03-23T00:00:05          24
1  2019-03-23T00:00:13          33