所以我有一个如下所示的数据集:
# Example
0 1 2 3 4 5
0 18 1 -19 -16 -5 19
1 18 0 -19 -17 -6 19
2 17 -1 -20 -17 -6 19
3 18 1 -19 -16 -5 20
4 18 0 -19 -16 -5 20
实际数据:
[{0: 18, 1: 1, 2: -19, 3: -16, 4: -5, 5: 19},
{0: 18, 1: 0, 2: -19, 3: -17, 4: -6, 5: 19},
{0: 17, 1: -1, 2: -20, 3: -17, 4: -6, 5: 19},
{0: 18, 1: 1, 2: -19, 3: -16, 4: -5, 5: 20},
{0: 18, 1: 0, 2: -19, 3: -16, 4: -5, 5: 20},
{0: 18, 1: 0, 2: -20, 3: -15, 4: -4, 5: 20},
{0: 19, 1: 1, 2: -18, 3: -16, 4: -5, 5: 20},
{0: 18, 1: 0, 2: -19, 3: -17, 4: -7, 5: 18},
{0: 18, 1: 0, 2: -20, 3: -18, 4: -7, 5: 18},
{0: 17, 1: 0, 2: -19, 3: -17, 4: -7, 5: 18},
{0: 18, 1: 0, 2: -19, 3: -16, 4: -4, 5: 20},
{0: 18, 1: 1, 2: -19, 3: -16, 4: -5, 5: 20},
{0: 18, 1: 0, 2: -19, 3: -16, 4: -4, 5: 20},
{0: 18, 1: 0, 2: -19, 3: -16, 4: -5, 5: 20},
{0: 18, 1: 1, 2: -18, 3: -16, 4: -5, 5: 20},
{0: 17, 1: 0, 2: -20, 3: -16, 4: -5, 5: 19},
{0: 17, 1: 0, 2: -19, 3: -16, 4: -4, 5: 20},
{0: 18, 1: 0, 2: -19, 3: -15, 4: -4, 5: 20},
{0: 18, 1: 0, 2: -19, 3: -14, 4: -3, 5: 22},
{0: 18, 1: 1, 2: -18, 3: -14, 4: -4, 5: 22}]
上面的形状是:(20, 6)
。
我想要实现的是将自定义function应用于当时4行的每一列。
示例:
- 第一次迭代 - >
f()
应用于所有列的df.ix[0:3]
; - 第二次迭代 - >
f()
应用于所有列的df.ix[4:7]
;
等等 . ..
在某种程度上我需要的是滚动大小为4的窗口,步幅为4。
使用上述数据时的结果将是形状的数据帧:(5, 6)
。仅仅为了参数,您可以假设自定义function为每列采用这4行的平均值。
到目前为止我尝试了什么?
- 我看着滚动,但滚动并没有做我需要做的事情。它滚动一个窗口,步幅为1。
- 实际上已经实现了它,但由于数据量的原因,我真的需要优化它:
这是代码:
curr = 0
res = []
while curr < df_to_look_at2.shape[0]:
look_at = df_to_look_at2.ix[curr:curr+3]
curr += 4
res.append(look_at.mean().values.tolist())
pd.DataFrame(res)
结果:
0 1 2 3 4 5
0 17.75 0.25 -19.25 -16.50 -5.50 19.25
1 18.25 0.25 -19.00 -16.00 -5.25 19.50
2 17.75 0.25 -19.25 -16.75 -5.75 19.00
3 17.75 0.25 -19.00 -16.00 -4.75 19.75
4 17.75 0.25 -18.75 -14.75 -3.75 21.00
一个额外的想法,如果它不仅取平均值,而是min(),max(),mean()和其他一些自定义函数...
分析解答
如果你想在一个以上的窗口中不止一次考虑一行,滚动就准确了. XB1但是,你的windows是独一无二的,所以你真正要问的是如何根据你的步幅进行分组,你可以用它来做arange
和地板部门。
window_size = 4
grouper = np.arange(df.shape[0]) // window_size
df.groupby(grouper).mean()
0 1 2 3 4 5
0 17.75 0.25 -19.25 -16.50 -5.50 19.25
1 18.25 0.25 -19.00 -16.00 -5.25 19.50
2 17.75 0.25 -19.25 -16.75 -5.75 19.00
3 17.75 0.25 -19.00 -16.00 -4.75 19.75
4 17.75 0.25 -18.75 -14.75 -3.75 21.00