我有一个Pandas数据框,其中一列称为[A],且值不同:
[A]
1
1
4
5
6
7
5
4
1
1
1
我想创建另一列-B-,并在A> 2时求和A的值。如果不满足此条件,则结果应为0。
最后,我的示例结果应为:
[B]
0
0
4
9
15
22
27
31
0
0
0
在Excel中执行此操作非常简单,因为您可以将[A]的值与先前的[B]值相加。但是我不知道如何用Python做到这一点。我尝试过:
DF['B'] = np.where(DF['A'] > 2, DF['A'] + DF['B'].shift(-1), 0)
但这不起作用。
任何帮助将不胜感激。
谢谢!
答案 0 :(得分:1)
此方法称为“累积和”,在熊猫中以.cumsum()
(此处为Stretchr Testify)的形式实现。
对于>2
条件,有多种选择,我敢肯定有一种更优雅的方法,但是我的选择是首先使用.clip(lower=2)
(documentation)来替换所有值<2
先用2
,然后用.replace(2,0)
(doc)将所有2
替换为0
。
(如果您只有非负整数,则只能使用一个.replace([1,2], 0)
)
工作示例:
import pandas as pd
x = pd.DataFrame({'A': [1,1,4,5,6,7,5,4,1,1,1]})
x['B'] = x.loc[:,'A'].clip(lower=2).replace(2, 0).cumsum()
print(x)
输出值:B: 0, 0, 4, 9, 15, 22, 27, 31, 31, 31, 31
这是一种可在存在值<2
时重置累计金额的技巧:
x['C'] = 0
for i in range(1, x.shape[0]):
if x.loc[i, 'A'] > 2:
z = x.loc[i-1, 'C'] if i else 0 # fix for i==0
x.loc[i, 'C'] = z + x.loc[i, 'A']
print(x)
输出值:C: 0, 0, 4, 9, 15, 22, 27, 31, 0, 0, 0