我有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
方法,但是同样的问题也适用。
答案 0 :(得分:1)
使用reset_index
,然后使用groupby
和resample
:
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)
将groupby
与pd.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
调用来同时处理“计算机”上的分组和一起重新采样“时间”,而不用单独使用resample
和groupby
。>