将2个Pandas列彼此相乘并获得值总和的最快方法

时间:2019-01-26 10:59:31

标签: python pandas

我正在做很多计算,将一个名为“ factor”的熊猫列与另一个称为“ value”的熊猫列相乘,然后计算相乘之和。

两列的长度通常约为200行。鉴于这是我在当前项目中进行的数千次计算,因此我需要尽可能快地进行

按比例缩小的代码看起来像这样(仅4行)

  dict = {'factor': [0.25,0.25,0.25,0.25],
        'value': [22000,25000,27000,35000] }

df = pd.DataFrame(dict, columns= ['factor', 'value'])

print((df['factor'] * df['value']).sum())

使用它可以打印27250。

有没有一种方法可以更快地获得相同的结果?

1 个答案:

答案 0 :(得分:1)

您可以使用numpy-通过values然后numpy.sum将列转换为一维数组:

np.random.seed(456)

d = {'factor': np.random.rand(200),
     'value': np.random.randint(1000, size=200)}

df = pd.DataFrame(d, columns= ['factor', 'value'])
#print (df)

In [139]: %timeit ((df['factor'] * df['value']).sum())
245 µs ± 2.64 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [140]: %timeit (np.sum((df['factor'].values * df['value'].values)))
20.6 µs ± 328 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

如果可能,某些缺失值会在输出中获得NaN,因此需要numpy.nansum来防止出现这种情况:

np.random.seed(456)

d = {'factor': np.random.rand(200),
     'value': np.random.randint(1000, size=200)}

df = pd.DataFrame(d, columns= ['factor', 'value'])
df['value'] = df['value'].mask(df['value'] > 700)
#print (df)

In [144]: %timeit ((df['factor'] * df['value']).sum())
235 µs ± 8.65 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [145]: %timeit (np.nansum((df['factor'].values * df['value'].values)))
33.3 µs ± 1.28 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)