Python 数据帧的矢量化计算

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和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_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 ms
pandas
和13.3 ms
numpy
,速度更快,我很难相信会有这么大的差距