基于同一列的前一个值对列值进行矢量化计算?

2024-04-26 11:42:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个pandas数据帧,有两列AB,如下所示。在

我需要一个向量化的解决方案来创建一个新的列C,其中C[i] = C[i-1] - A[i] + B[i]。在

df = pd.DataFrame(data={'A': [10, 2, 3, 4, 5, 6], 'B': [0, 1, 2, 3, 4, 5]})

>>> df 
     A  B
 0  10  0
 1   2  1
 2   3  2
 3   4  3
 4   5  4
 5   6  5

下面是使用for循环的solution

^{pr2}$

。。。它起作用了。在

但是,由于与矢量化计算相比,循环速度较慢,我需要在pandas中对此采用矢量化的解决方案

我试着像这样使用shift()方法:

df['C'] = df['C'].shift(1).fillna(df['A']) - df['A'] + df['B']

但这没有帮助,因为移位的C列没有随着计算进行更新。它保持其原始价值:

>>> df['C'].shift(1).fillna(df['A'])
0    10
1    10
2     2
3     3
4     4
5     5

这就产生了一个错误的结果。在


Tags: 数据方法dataframepandasdffordatashift
1条回答
网友
1楼 · 发布于 2024-04-26 11:42:21

这可以矢量化,因为:

  • delta[i] = C[i] - C[i-1] = -A[i] +B[i]。你可以先从A和{}得到{},然后。。。在
  • 计算delta(加上C[0])的累计和,得到完整的C

代码如下:

delta = df['B'] - df['A']
delta[0] = 0
df['C'] = df.loc[0, 'A'] + delta.cumsum() 
​
print df
    A  B   C
0  10  0  10
1   2  1   9
2   3  2   8
3   4  3   7
4   5  4   6
5   6  5   5

相关问题 更多 >