首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据同一列的前一个值对列的值进行矢量化计算?

根据同一列的前一个值对列的值进行矢量化计算?
EN

Stack Overflow用户
提问于 2015-12-27 18:31:29
回答 1查看 314关注 0票数 6

我有一只熊猫,它有两栏AB,如下所示。

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

代码语言:javascript
复制
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

代码语言:javascript
复制
df['C'] = df['A']

for i in range(1, len(df)):
    df['C'][i] = df['C'][i-1] - df['A'][i] + df['B'][i] 

>>> 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

..。这就是我的工作。

但是由于循环比矢量化计算慢,所以我想在熊猫中给出一个矢量化的解决方案。

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

代码语言:javascript
复制
df['C'] = df['C'].shift(1).fillna(df['A']) - df['A'] + df['B']

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

代码语言:javascript
复制
>>> df['C'].shift(1).fillna(df['A'])
0    10
1    10
2     2
3     3
4     4
5     5

这就产生了错误的结果。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-27 18:46:41

这可以矢量化,因为:

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

守则如下:

代码语言:javascript
复制
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
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34483518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档