Python pandas groupby中的非重叠滚动窗口
我想在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
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不,它没有给出任何错误