如何对数据帧执行窗口操作



给定

import pandas as pd
import numpy as np
ssss = pd.DataFrame(np.arange(6))

ssss:

0
0  0
1  1
2  2
3  3
4  4
5  5

我想对数据帧执行滑动窗口操作。

我想在任意大小、任意步长的滑动窗口上执行通用函数(在这种情况下是指,但它可以是另一个函数,并涉及多个输入列(。

在这种情况下,窗口大小为2,步长也是2。

熊猫支持这种手术吗?

res:

0 res
0  0 0.5
1  1 0.5
2  2 2.5
3  3 2.5
4  4 4.5
5  5 4.5

似乎groupby不是我想要的。

我可以选择一个愚蠢的解决方案,但即便如此,我也不确定什么是标准方法。我希望熊猫能支持这样的事情,但找不到任何方法。


编辑:

ssss:

假设第1列的值为字符串

0 1   2
0  0 "5" a
1  1 "4" b
2  2 "3" c
3  3 "2" d
4  4 "1" e
5  5 "0" f

我想用作为一个非常一般的例子

def row_reduce(col0, col1):
return str(2 * col0) + col1
def col_reduce(rows_data):
return ",".join(rows_data)

获得(忽略第2列(

0 1   2 res
0  0 "5" a "05,24"
1  1 "4" b "05,24"
2  2 "3" c "43,62"
3  3 "2" d "43,62"
4  4 "1" e "81,100"
5  5 "0" f "81,100"

这首先使用自定义函数执行行缩减,然后执行带窗口的列缩减。

如果窗口不重叠,则可以使用groupby

我想你需要带整数除法的GroupBy.transform

#if default RangeIndex
ssss['res'] = ssss.groupby(ssss.index // 2)[0].transform('mean')
#any index - helper array
ssss['res'] = ssss.groupby(np.arange(len(ssss)) // 2)[0].transform('mean')
print (ssss)
0  res
0  0  0.5
1  1  0.5
2  2  2.5
3  3  2.5
4  4  4.5
5  5  4.5

编辑:

print (df)
0  1  2
0  0  5  a
1  1  4  b
2  2  3  c
3  3  2  d
4  4  1  e
5  5  0  f
def row_reduce(col0, col1):
return str(2 * col0) + str(col1)
def col_reduce(rows_data):
return ",".join(rows_data)

df['res'] = (df.apply(lambda x: row_reduce(x[0], x[1]), axis=1)
.groupby(df.index // 2)
.transform(col_reduce))
print (df)
0  1  2     res
0  0  5  a   05,24
1  1  4  b   05,24
2  2  3  c   43,62
3  3  2  d   43,62
4  4  1  e  81,100
5  5  0  f  81,100

最新更新