9我有一个多索引数据帧,我想重新采样以将数据点的频率降低3倍(意味着每3行变成一个)。
此:
time value
ID measurement
ET001 0 0 2
1 0.15 3
2 0.3 4
3 0.45 3
4 0.6 3
5 0.75 2
6 0.9 3
ET002 0 0 2
1 0.16 5
2 0.32 4
3 0.45 3
4 0.6 3
5 0.75 2
我想变成这个:
time value
ID measurement
ET001 0 0.15 3
1 0.6 2.7
2 0.9 3
ET002 0 0.16 3.7
1 0.6 2.7
我尝试将我的时间列转换为像这样的pandas datetime索引,然后使用resample:
df = df.set_index(pd.DatetimeIndex(timecourse_normed['Time']))
df = df.groupby(level=0).resample(rule='0.1S', how=np.mean)
但是第一行给了我实际的日期(1970年的东西),这对第二行来说是无益的。浏览arund堆栈溢出我发现了一些类似的quiestios,它们都有解决方案,不是基于熊猫的重采样 - 而且,遗憾的是,我的用例不可行。
你能帮我一把吗?
答案 0 :(得分:3)
我认为你的想法可能是 - 将每个ID
内的记录分成3个记录(如SQL中的ntile(3)组)并计算平均值。要创建此数字,我们可以使用这样一个事实:您已经拥有每行的序列号 - measurement
级别的索引。因此,我们可以将此数字除以3
以获得我们需要的数字:
>>> df
time value ntile
ID measurement
ET001 0 0.00 2 0
1 0.15 3 0
2 0.30 4 0
3 0.45 3 1
4 0.60 3 1
5 0.75 2 1
6 0.90 3 2
ET002 0 0.00 2 0
1 0.16 5 0
2 0.32 4 0
3 0.45 3 1
4 0.60 3 1
5 0.75 2 1
因此我们可以使用这样的辅助函数并将其应用于每个组以获得所需的结果。
>>> def helper(x):
... x = x.reset_index()
... x = x.groupby(x['measurement'].div(3)).mean()
... del x['measurement']
... return x
...
>>> df.groupby(level=0).apply(helper)
time value
ID measurement
ET001 0 0.15 3.000000
1 0.60 2.666667
2 0.90 3.000000
ET002 0 0.16 3.666667
1 0.60 2.666667
希望它有所帮助。