np.random.seed([3, 14])
df = pd.DataFrame(np.random.randn(5, 3), columns=list('ABC'))
df
A B C
0 -0.602923 -0.402655 0.302329
1 -0.524349 0.543843 0.013135
2 -0.326498 1.385076 -0.132454
3 -0.407863 1.302895 -0.604236
4 -0.243362 -0.211261 -2.056621
计算df.A * 1 + df.B * 2 + df.C * 3
的最快方法是什么?
基本上,我想要,对于这个数据帧:
0 -0.501247
1 0.602741
2 2.046290
3 0.385219
4 -6.835748
答案不能为df.A * 1 + df.B * 2 + df.C * 3
,因为列数不得硬编码。所以,我想以某种方式计算df.iloc[:, 0] * 1 + df.iloc[:, 1] * 2, ....
。
我也对任何numba
解决方案感兴趣!
答案 0 :(得分:2)
我尝试改进解决方案 - 删除重塑并更改arrange
:
a = df.dot(np.arange(1, len(df.columns)+1))
print (a)
0 -0.501247
1 0.602741
2 2.046290
3 0.385219
4 -6.835748
dtype: float64
numpy
:
a = pd.Series(np.dot(df.values, np.arange(1, len(df.columns)+1)), index=df.index)
print (a)
0 -0.501247
1 0.602741
2 2.046290
3 0.385219
4 -6.835748
dtype: float64
答案 1 :(得分:1)
选项1
据我所知,最快的是使用df.dot
。
df.dot((np.arange(df.shape[1]) + 1).reshape(-1, 1))
0
0 -0.501247
1 0.602741
2 2.046290
3 0.385219
4 -6.835748
选项2
元素明智的产品和sum
沿第一轴
(df * (np.arange(df.shape[1]) + 1)).sum(1)
0 -0.501246
1 0.602742
2 2.046292
3 0.385219
4 -6.835747
<强>性能强>
5 x 3
)10000 loops, best of 3: 131 µs per loop # dot
1000 loops, best of 3: 531 µs per loop # element-wise prod + sum
100000 x 1000
)10 loops, best of 3: 36.4 ms per loop # dot
1 loop, best of 3: 1.18 s per loop # element-wise prod + sum
有关实施pandas
/ numpy
的{{1}}功能背后的魔力的信息,您可以查看Why is matrix multiplication faster with numpy than with ctypes in Python?。