Python 数据帧的矢量化计算
我有一个使用循环解决的小问题,但我试图看看是否有一种方法可以尝试将其中一些向量化,以尝试提高性能 基本上我有两个数据帧(DF_A和DF_B),其中DF_B中的行基于DF_A中对应行和DF_B中上面行的总和。我有DF_B中的第一行值Python 数据帧的矢量化计算,python,pandas,numpy,Python,Pandas,Numpy,我有一个使用循环解决的小问题,但我试图看看是否有一种方法可以尝试将其中一些向量化,以尝试提高性能 基本上我有两个数据帧(DF_A和DF_B),其中DF_B中的行基于DF_A中对应行和DF_B中上面行的总和。我有DF_B中的第一行值 df_a = [ [1,2,3,4] [5,6,7,8] [..... more rows] ] df_b = [ [1,2,3,4] [ rows of all 0 values here, so dimensions match df_a] ]
df_a = [
[1,2,3,4]
[5,6,7,8]
[..... more rows]
]
df_b = [
[1,2,3,4]
[ rows of all 0 values here, so dimensions match df_a]
]
我想得到的是,例如,df_b中的第二行将是df_b中第一行的值+df_a中第二行的值。因此,在这种情况下:
df_b.loc[2] = [6,8,10,12]
我能够使用df_a范围内的循环来实现这一点,保留保存的前几行值,然后将当前索引的行添加到前几行值中。似乎效率不高。这里有一个
numpy
解决方案。这应该比pandas
循环快得多,特别是因为它通过numba
使用JIT编译
from numba import jit
a = df_a.values
b = df_b.values
@jit(nopython=True)
def fill_b(a, b):
for i in range(1, len(b)):
b[i] = b[i-1] + a[i]
return b
df_b = pd.DataFrame(fill_b(a, b))
# 0 1 2 3
# 0 1 2 3 4
# 1 6 8 10 12
# 2 15 18 21 24
# 3 28 32 36 40
# 4 45 50 55 60
绩效基准测试
import pandas as pd, numpy as np
from numba import jit
df_a = pd.DataFrame(np.arange(1,1000001).reshape(1000,1000))
@jit(nopython=True)
def fill_b(a, b):
for i in range(1, len(b)):
b[i] = b[i-1] + a[i]
return b
def jp(df_a):
a = df_a.values
b = np.empty(df_a.values.shape)
b[0] = np.arange(1, 1001)
return pd.DataFrame(fill_b(a, b))
%timeit df_a.cumsum() # 16.1 ms
%timeit jp(df_a) # 6.05 ms
您可以使用
dfu a
上的累积和创建dfu b
,如下所示
df_a = pd.DataFrame(np.arange(1,17).reshape(4,4))
df_b = df_a.cumsum()
0 1 2 3
0 1 2 3 4
1 6 8 10 12
2 15 18 21 24
3 28 32 36 40
你能提供一个有效的样本数据集和你期望的输出吗?这正是我想要的。我知道这是必须的simple@jpp,我没有。我相信如果你在这里发布一个问题,有人会知道相关的:谢谢你的回答,我测试了两者,它们都按预期工作。这很有趣,我真的希望cumsum会更快。我使用的是python 3.6,pandas 0.20.3。那是你的吗?同样的,我得到了6.05 ms
numba
、16.1 mspandas
和13.3 msnumpy
,速度更快,我很难相信会有这么大的差距