我有一个这样的数据框:
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_1
,A_2
是列A_G2
的{{1}} }和mean
;这同样适用于A_3
和A_4
。所以我想要做的是计算两个连续列的平均值,并将结果作为新列添加到数据帧中。
简单的实现可能如下所示:
B_G1
给出了所需的输出(列名除外):
B_G2
有没有更好的方法来做到这一点,即矢量化方式?
答案 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
-
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