当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《基于同一列的先前值对列值进行矢量化计算?》经验,为你挑选了1个好方法。

我有一个包含2列的pandas数据框,如下所示:

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

我想以下列方式创建一个新列C:C [i] = C [i-1] -A [i] + B [i]

在这个问题中,答案建议使用这样的循环:

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

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

这会产生错误的结果.



1> Happy001..:

由于delta [i] = C [i] - C [i-1] = -A [i] + B [i],因此可以对问题进行矢量化.您可以先从A和B获得delta,然后计算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

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有