Python pandas groupby中的非重叠滚动窗口

Python pandas groupby中的非重叠滚动窗口,python,pandas,Python,Pandas,我想在pandas groupby中创建不重叠的滚动或滑动窗口 import pandas as pd df1 = pd.DataFrame( {'a1':['A','A','B','B','B','B','B','B'],'a2':[1,1,1,2,2,2,2,2], 'b':[1,2,5,5,5,4,6,2]}) 对于重叠滚动窗口,我可以这样做 df1.groupby(['a1','a2']).rolling(2).mean() 但是有没有办法使它不重叠呢 输出应该是这样的 pd.Dat

我想在pandas groupby中创建不重叠的滚动或滑动窗口

import pandas as pd
df1 = pd.DataFrame( {'a1':['A','A','B','B','B','B','B','B'],'a2':[1,1,1,2,2,2,2,2], 'b':[1,2,5,5,5,4,6,2]})

对于重叠滚动窗口,我可以这样做

df1.groupby(['a1','a2']).rolling(2).mean()
但是有没有办法使它不重叠呢

输出应该是这样的

pd.DataFrame('a1':['A','B','B','B','B'],'a2':[1,1,2,2,2],'b':[1.5,NaN,5,5,NaN])
解释

a1
A
a2
1
时,b的值为
1
2
。在
1.5
中添加这两个结果
a1
B
a2
1
时,
B
的值为
5
。由于
b
的值小于滑动窗口的长度,我们得到
NaN

a1
B
a2
2
时,B的值为
5,5,4,6,2
。由于滑动窗口是
2
,因此添加
(5+5)/2=5
(4+6)/2=5
。最后一个值是
NaN
,因为长度小于滑动窗口。

好的,一种方法(不是很优雅)是:

def non_overlapping_mean(x, window=2):
    return x.groupby(np.arange(len(x)) // window).apply(lambda x: np.nan if len(x) < 2 else x.mean())


res = df1.groupby(['a1', 'a2'])['b'].apply(non_overlapping_mean).droplevel(-1).reset_index()
print(res)
其主要思想是将数据分组成连续的数据块,具体操作如下:

x.groupby(np.arange(len(x)) // window)
一种方法(不是很优雅)是:

def non_overlapping_mean(x, window=2):
    return x.groupby(np.arange(len(x)) // window).apply(lambda x: np.nan if len(x) < 2 else x.mean())


res = df1.groupby(['a1', 'a2'])['b'].apply(non_overlapping_mean).droplevel(-1).reset_index()
print(res)
其主要思想是将数据分组成连续的数据块,具体操作如下:

x.groupby(np.arange(len(x)) // window)

您可以添加输出吗?@Danimesjo我添加了示例输出“对于重叠滚动窗口,我可以这样做”您不能。它给出了一个错误。@AmiTavory不,它没有给出任何错误。您可以添加输出吗?@Danimesjo我添加了示例输出“对于重叠滚动窗口,我可以这样做”您不能。它给出了一个错误。@AmiTavory不,它没有给出任何错误