Python 计算数据帧2x2行-列组的平均值

Python 计算数据帧2x2行-列组的平均值,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个数据帧,我想采取多种方式,并为其输出一个系列/数据帧 我希望每个平均值都由整个数据帧的2x2切片进行分组 这方面的一个例子是: df = pd.DataFrame({'0' : [4, 5, 6, 7, 8, 10], '1' : [2, 0, 1, 2, 3, 4], '2' : [2, 4, 6, 8, 10, 12]}).T df_mean 2.75 3 4 5 . . 5.75 7.25 分组的方法是,取第一行2x2‘切片’([4,5]

我有一个数据帧,我想采取多种方式,并为其输出一个系列/数据帧

我希望每个平均值都由整个数据帧的2x2切片进行分组

这方面的一个例子是:

df = pd.DataFrame({'0' : [4, 5, 6, 7, 8, 10], '1' : [2, 0, 1, 2, 3, 4],
                   '2' : [2, 4, 6, 8, 10, 12]}).T

df_mean

2.75
3
4
5
.
.
5.75
7.25
分组的方法是,取第一行2x2‘切片’
([4,5],[2,0])
计算平均值
(4+5+2+0)/4=2.75
,然后对每个切片重复此操作,直到下一行计算所有可能的2x2切片

即:

我只知道如何将2按行分组并取平均值:

df_mean = df.groupby(np.arange(len(df)) // 2).mean()
但这只在每列下按2分组,而不是按2x2“单元格”分组


有没有一种方法可以使用groupby来实现这一点?如果可能的话,我会尽量避免在行和列索引上循环的计算开销。

如果您所有的数据都是同一类型的,您可以使用

size = (2,2)

from numpy.lib.stride_tricks import as_strided

strides = df.values.strides

new_rows = (df.shape[0] - size[0] + 1) 
new_cols = (df.shape[1] - size[1] + 1)

array = as_strided(df.values, 
                   (size[0],size[1], new_rows, new_cols), 
                   [strides[0], strides[1], strides[0], strides[1]])

np.mean(array,
        axis=(0,1))
输出:

array([[2.75, 3.  , 4.  , 5.  , 6.25],
   [2.  , 2.75, 4.25, 5.75, 7.25]])

我使用沿两个轴的
滚动
平均值
dropna
,以获得您想要的结果:

将熊猫作为pd导入
df=pd.DataFrame(
{'0': [4, 5, 6, 7, 8, 10], '1': [2, 0, 1, 2, 3, 4], '2': [2, 4, 6, 8, 10, 12]}
)T
平均值_df=(
df.滚动(2)
.mean()
.dropna(how='all')
.滚动(2,轴='列')
.mean()
.dropna(how='all',axis='columns')
)
打印(平均值)


滚动创建计算平均值的窗口,当窗口在数据帧之外获取值时,dropna将删除有
NaN
值的行。

您可以使用它来做些什么,它允许窗口沿任意一个轴移动
array([[2.75, 3.  , 4.  , 5.  , 6.25],
   [2.  , 2.75, 4.25, 5.75, 7.25]])
      1     2     3     4     5
1  2.75  3.00  4.00  5.00  6.25
2  2.00  2.75  4.25  5.75  7.25