Python 如何在数据帧上执行窗口操作?

Python 如何在数据帧上执行窗口操作?,python,pandas,Python,Pandas,给定 ssss: import pandas as pd import numpy as np ssss = pd.DataFrame(np.arange(6)) 我想在数据帧上执行滑动窗口操作 我想在任意大小的滑动窗口上以任意的步幅执行一个通用函数(在本例中是指,但它可以是另一个函数,并且涉及多个输入列) 在这种情况下,窗口大小为2,步幅长度也为2 熊猫是否支持这种操作 res: 似乎我找的不是groupby 我可以使用numpy解决方案,但即使如此,我也不确定标准方法是什么。我希望熊猫

给定

ssss

import pandas as pd
import numpy as np

ssss = pd.DataFrame(np.arange(6))
我想在数据帧上执行滑动窗口操作

我想在任意大小的滑动窗口上以任意的步幅执行一个通用函数(在本例中是指,但它可以是另一个函数,并且涉及多个输入列)

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

熊猫是否支持这种操作

res:


似乎我找的不是
groupby

我可以使用numpy解决方案,但即使如此,我也不确定标准方法是什么。我希望熊猫会支持这样的东西,但找不到任何方法


编辑:

ssss

import pandas as pd
import numpy as np

ssss = pd.DataFrame(np.arange(6))
假设第1列的值是字符串

   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
我想用一个非常普遍的例子

   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
获取(忽略第2列时)


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

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

我认为您需要整数除法:

   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

我认为您需要整数除法:

   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"
编辑:


如何使用我自己的函数,可以接受更多列作为输入?请参阅编辑。我试着尽可能的笼统和精确。也许
,“.join
没有什么意义,但我希望这传达了主要思想。另外,请注意ssss.index//2不允许步幅重叠,但如果这是为了另一个问题,我不介意。@Gulzar-不确定是否理解,所以可能新问题会很好,我将脱机,因此其他人将为您解答。我将如何使用我自己的函数,可以接受更多列作为输入?请参阅编辑。我试着尽可能的笼统和精确。也许
,“.join
没有什么意义,但我希望这传达了主要思想。另外,请注意ssss.index//2不允许步幅重叠,但如果这是为了另一个问题,我不介意。@Gulzar-不确定是否理解,所以可能新问题会很好,我将脱机,所以其他人会为您解答。但令我非常失望的是,步长仍然硬编码为1。@timgeb我确实考虑过这一点,并想知道如果步长不是1,预期的输出会是什么。我认为这没有多大意义。但令我非常失望的是,步长仍然被硬编码为1。@timgeb我确实考虑过这一点,并想知道如果步长不是1,预期的输出会是什么。我想这没什么意义。
#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