如何计算n个连续列的平均值?

时间:2016-11-21 16:44:57

标签: python performance pandas optimization vectorization

我有一个这样的数据框:

import pandas as pd

df = pd.DataFrame({'A_1': [1, 2], 'A_2': [3, 4], 'A_3': [5, 6], 'A_4': [7, 8],
                   'B_1': [0, 2], 'B_2': [4, 4], 'B_3': [9, 6], 'B_4': [5, 8]})

   A_1  A_2  A_3  A_4  B_1  B_2  B_3  B_4
0    1    3    5    7    0    4    9    5
1    2    4    6    8    2    4    6    8

我希望将其转换为如下所示的数据框:

   A_G1  A_G2  B_G1  B_G2
0     2     6     2     7
1     3     7     3     7

因此,A_G1是列mean的{​​{1}}和A_1A_2是列A_G2的{​​{1}} }和mean;这同样适用于A_3A_4。所以我想要做的是计算两个连续列的平均值,并将结果作为新列添加到数据帧中。

简单的实现可能如下所示:

B_G1

给出了所需的输出(列名除外):

B_G2

有没有更好的方法来做到这一点,即矢量化方式?

2 个答案:

答案 0 :(得分:4)

这可能对您有用:

In [15]: df.rolling(window=2,axis=1).mean().iloc[:,1::2]
Out[15]:
   A_2  A_4  B_2  B_4
0  2.0  6.0  2.0  7.0
1  3.0  7.0  3.0  7.0

但我没有针对你的“直截了​​当”实施进行测试。

答案 1 :(得分:2)

这是使用reshaping -

的基于NumPy的矢量化解决方案
pd.DataFrame(df.values.reshape(-1,df.shape[1]//n,n).mean(2))

样品运行 -

In [65]: df
Out[65]: 
   A_1  A_2  A_3  A_4  B_1  B_2  B_3  B_4
0    1    3    5    7    0    4    9    5
1    2    4    6    8    2    4    6    8

In [66]: n = 2

In [67]: pd.DataFrame(df.values.reshape(-1,df.shape[1]//n,n).mean(2))
Out[67]: 
     0    1    2    3
0  2.0  6.0  2.0  7.0
1  3.0  7.0  3.0  7.0

In [68]: n = 4

In [69]: pd.DataFrame(df.values.reshape(-1,df.shape[1]//n,n).mean(2))
Out[69]: 
     0    1
0  4.0  4.5
1  5.0  5.0

运行时测试 -

In [71]: df = pd.DataFrame(np.random.randint(0,9,(200,800)))

In [72]: %timeit df.rolling(window=2,axis=1).mean().iloc[:,1::2]
100 loops, best of 3: 11 ms per loop # @juanpa.arrivillaga's soln

In [73]: n = 2

In [74]: %timeit pd.DataFrame(df.values.reshape(-1,df.shape[1]//n,n).mean(2))
100 loops, best of 3: 2.6 ms per loop