我正在尝试创建一个列,该列是Pandas中的条件累积总和。我知道如何在Excel中轻松地做到这一点,但我确实在努力找出如何在Pandas中实现这一目标。考虑以下数据框
df:
Year Income
0 2001 17
1 2001 4
1 2001 9
2 2002 6
2 2002 1
2 2002 1
3 2003 12
3 2003 11
3 2003 5
我想在数据框中添加一个新列。新列应包含以下所有收入的总和:
所以输出看起来像:
df:
Year Income Cum_Income
0 2001 17 13 # 2 values less than 17 in 2001: 4 + 9 = 13
1 2001 4 0 # no values less than 4 in 2001: 0
1 2001 9 4 # 1 value less than 9 in 2001 : 4
2 2002 6 2 # etc.
2 2002 1 0
2 2002 1 0
3 2003 12 16
3 2003 11 5
3 2003 5 0
我能想到的唯一方法是循环遍历每一行并分别计算Cum_income中的每个单元格,但我希望有一种更干净的方法。任何建议都将非常有帮助。
答案 0 :(得分:1)
numpy
广播中的一些魔法
s1 = df.Year.values
s2 = df.Income.values
np.sum((s1==s1[:,None])*((s2<s2[:,None])*s2), axis=1)
Out[246]: array([13, 0, 4, 2, 0, 0, 16, 5, 0], dtype=int64)
#df['New'] = np.sum((s1==s1[:,None])*((s2<s2[:,None])*s2), axis=1)
说明
(s1==s1[:,None])
与年份匹配,如果年份不相同,我们不检查值,在您的情况下,它将返回False,值* False为0
(s2<s2[:,None])*s2
检查当前行的值是否具有大于该值的值,如果返回True,则将True乘以该行的值将作为将来累加的值。