计算列之间加权产品总和的最快方法是什么?

时间:2017-09-08 08:41:32

标签: python performance pandas numpy dataframe

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解决方案感兴趣!

2 个答案:

答案 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?