熊猫数据框-如何创建条件和,条件取决于数据框中的另一列

时间:2020-09-16 17:07:05

标签: python pandas dataframe

我正在尝试创建一个列,该列是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

我想在数据框中添加一个新列。新列应包含以下所有收入的总和:

  1. “ Year”的值与我们正在计算的行的“ Year”的值相同
  2. “ Income”的值小于或等于我们正在计算的那一行的“ Income”值

所以输出看起来像:

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中的每个单元格,但我希望有一种更干净的方法。任何建议都将非常有帮助。

1 个答案:

答案 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乘以该行的值将作为将来累加的值。