我有一个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
我该怎么办?谢谢您的帮助!
答案 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,而不仅仅是新列。