使用不同长度的列求和

时间:2019-10-29 20:26:29

标签: pandas

我有一个pd df。

表格如下:

  df

      lifetime   0       1       2       3      4       5  ....  30
   0    2        0.12   0.14    0.18    0.12    0.13  0.14 ....  0.14
   1    3        0.12   0.14    0.18    0.12    0.13  0.14 ....  0.14
   2    4        0.12   0.14    0.18    0.12    0.13  0.14 ....  0.14

我想基于列“生存期”的值对0到30列进行求和,因此结果如下:

  df
     lifetime    Total
   0    2        sum(0.12+ 0.14) # sum column 0 and 1
   1    3        sum(0.12+0.14+0.18) #sum from column 0 to 2  
   2    4        sum(0.12+0.14+0.18+0.12+0.13) #sum from column 0 to 3

我该怎么办?谢谢您的帮助!

2 个答案:

答案 0 :(得分:2)

您可以将where用于广播:

s = df.iloc[:,1:]
s.where(df.lifetime.to_numpy()[:,None] > np.arange(s.shape[1])).sum(1)

输出:

0    0.26
1    0.44
2    0.56
dtype: float64

答案 1 :(得分:1)

定义以下功能:

def mySum(row):
    uLim = int(row.lifetime) + 1
    return row.iloc[1:uLim].sum()

然后应用它,并在 lifetime 列中加入结果:

df = df.lifetime.to_frame().join(df.apply(mySum, axis=1).rename('Total'))

与其他解决方案相比的优势在于,我的解决方案可以创建 目标DataFrame,而不仅仅是新列。