我正在做很多计算,将一个名为“ 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。
有没有一种方法可以更快地获得相同的结果?
答案 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)