条件为真时如何对熊猫列的值求和(Python)

时间:2020-04-08 09:09:26

标签: python python-3.x pandas

我有一个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)

但这不起作用。

任何帮助将不胜感激。

谢谢!

1 个答案:

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