按时间间隔对列进行分类并计算总和

时间:2019-01-16 20:57:21

标签: python python-3.x pandas group-by pandas-groupby

我有pandas DataFrame:

df = pd.DataFrame({
    "computer": [0, 1, 2, 3, 0, 1, 2, 3],
    "time":     [0, 0, 1, 1, 2, 3, 4, 5],
    "value":    [4, 1, 5, 6, 1, 0, 3, 4],
})
df["time"] = pd.to_datetime(df["time"], unit="s")
df.set_index(["computer", "time"])

我想将time列合并为4s间隔并求和value。 输出如下:

df = pd.DataFrame({
    "computer":   [0, 1, 2, 3, 2, 3],
    "start_time": [0, 0, 0, 0, 4, 4],
    "value":      [5, 1, 5, 6, 3, 4],
})
df["start_time"] = pd.to_datetime(df["start_time"], unit="s")
df.set_index(["computer", "start_time"])

我尝试应用Pandas group by time windows提供的代码,但是由于有多重索引,我无法使其正常工作。 我也尝试过resample方法,但是同样的问题也适用。

2 个答案:

答案 0 :(得分:1)

使用reset_index,然后使用groupbyresample

df.reset_index(level=0).groupby('computer').resample('4s')['value']\
   .sum().to_frame().sort_index(level=1)

OR

df.reset_index('computer').groupby('computer').resample('4s')['value']\
   .sum().to_frame().sort_index(level=1)

输出:

                              value
computer time                      
0        1970-01-01 00:00:00      5
1        1970-01-01 00:00:00      1
2        1970-01-01 00:00:00      5
3        1970-01-01 00:00:00      6
2        1970-01-01 00:00:04      3
3        1970-01-01 00:00:04      4

答案 1 :(得分:1)

groupbypd.Grouper一起使用:

u = (df.groupby(['computer', pd.Grouper(key='time', freq='4s')])
       .sum()
       .sort_index(level=1)
       .reset_index())
u['time'] = u['time'].dt.second

u
   computer  time  value
0         0     0      5
1         1     0      1
2         2     0      5
3         3     0      6
4         2     4      3
5         3     4      4

您可以允许一个groupby调用来同时处理“计算机”上的分组和一起重新采样“时间”,而不用单独使用resamplegroupby