Pandas相当于整数索引的重采样

Tom*_*Cho 8 python resampling pandas

我正在寻找一个等效resample于数据帧的方法的熊猫,它不是一个DatetimeIndex整数数组,甚至可能是浮点数.

我知道,对于某些情况(例如,这个),重新采样方法可以通过reindex和插值轻松替换,但在某些情况下(我认为)它不能.

例如,如果我有

df = pd.DataFrame(np.random.randn(10,2))
withdates = df.set_index(pd.date_range('2012-01-01', periods=10))
withdates.resample('5D', np.std)
Run Code Online (Sandbox Code Playgroud)

这给了我

                   0         1
2012-01-01  1.184582  0.492113
2012-01-06  0.533134  0.982562
Run Code Online (Sandbox Code Playgroud)

但我不能用df和重新取样产生相同的结果.所以我正在寻找可以起作用的东西

 df.resample(5, np.std)
Run Code Online (Sandbox Code Playgroud)

这会给我

          0         1
0  1.184582  0.492113
5  0.533134  0.982562
Run Code Online (Sandbox Code Playgroud)

这种方法存在吗?我能够创建这种方法的唯一方法是手动分离df成较小的数据帧,np.std然后应用然后将所有内容连接起来,我觉得这很慢,而且根本不聪明.

干杯

piR*_*red 7

建立

import pandas as pd
import numpy as np

np.random.seed([3,1415])
df = pd.DataFrame(np.random.rand(20, 2), columns=['A', 'B'])
Run Code Online (Sandbox Code Playgroud)

您需要创建标签以自行分组.我用的是:

(df.index.to_series() / 5).astype(int)
Run Code Online (Sandbox Code Playgroud)

为了获得一系列值,[0, 0, 0, 0, 0, 1, 1, 1, 1, 1, ...] 然后在a中使用它groupby

您还需要为新数据帧指定索引.我用的是:

df.index[4::5]
Run Code Online (Sandbox Code Playgroud)

获得当前指数从第5个位置开始(因此4)和之后的每个第5个位置.它看起来像[4, 9, 14, 19].我可以做到这一点,df.index[::5]以获得起始位置,但我去了结束位置.

# assign as variable because I'm going to use it more than once.
s = (df.index.to_series() / 5).astype(int)

df.groupby(s).std().set_index(s.index[4::5])
Run Code Online (Sandbox Code Playgroud)

好像:

           A         B
4   0.198019  0.320451
9   0.329750  0.408232
14  0.293297  0.223991
19  0.095633  0.376390
Run Code Online (Sandbox Code Playgroud)

其他考虑

这相当于下采样.我们还没有解决抽样问题.

为了更频繁地从我们生成的数据框索引返回到数据框索引,我们可以这样使用reindex:

# assign what we've done above to df_down
df_down = df.groupby(s).std().set_index(s.index[4::5])

df_up = df_down.reindex(range(20)).bfill()
Run Code Online (Sandbox Code Playgroud)

好像:

           A         B
0   0.198019  0.320451
1   0.198019  0.320451
2   0.198019  0.320451
3   0.198019  0.320451
4   0.198019  0.320451
5   0.329750  0.408232
6   0.329750  0.408232
7   0.329750  0.408232
8   0.329750  0.408232
9   0.329750  0.408232
10  0.293297  0.223991
11  0.293297  0.223991
12  0.293297  0.223991
13  0.293297  0.223991
14  0.293297  0.223991
15  0.095633  0.376390
16  0.095633  0.376390
17  0.095633  0.376390
18  0.095633  0.376390
19  0.095633  0.376390
Run Code Online (Sandbox Code Playgroud)

我们也可以用其他的东西reindex像由range(0, 20, 2)多达样品甚至整数索引.