特定列上的Python数据框总和

时间:2019-01-04 14:14:33

标签: python pandas numpy

我的任务是计算累积本金。使用numpy.ppmt只能给出特定月份的有偿本金,因此我想添加包含每个记录的每月本金的列,然后取总和来获得累积本金。

例如,我有一个如下数据框:

> map head list
[1,4,7]
> map tail list
[[2,3],[5,6],[8,9]]
> let foo xs = if null (head xs) then [] else map head xs : foo (map tail xs)
> foo list
[[1,4,7],[2,5,8],[3,6,9]]

数据框将如下所示:

frame = pd.DataFrame({'rate':[0.1, 0.1], 'per':[2, 4], 'nper':[360, 360], 'pv':[100000, 200000]})

max_per = frame['per'].max()
columns = ['principal%s'%i for i in range(1, max_per + 1)]
df = pd.DataFrame(index=frame.index, columns=columns, dtype='float').fillna(0)

for index, column in enumerate(columns):
    df[column] = -np.ppmt(rate=frame['rate'] / 100 / 12, per=index + 1, nper=frame['nper'], 
                          pv=frame['pv'], when=when)
frame.join(df)

问题在于,对于记录1,principal3和principal4应该为0。一种解决方法是基于列“ per”来计算principal1-principal4的总和,例如,如果frame.per == 2,则我仅求和principal1和principal 2,如果frame.per == 4,那么我只将principal1到principal4求和。任何帮助做到这一点。

我可以通过调用apply来计算累计本金,但是我不想这样做,因为它很慢。

谢谢。

1 个答案:

答案 0 :(得分:2)

通过布尔掩码在0之前将join设置为per,然后通过布尔掩码将2d numpy array的列长度与#subtract 1 because python counts from 0 mask = np.arange(len(df.columns)) > frame['per'].values[:, None] - 1 df = frame.join(df.mask(mask, 0)) print(df) rate per nper pv principal1 principal2 principal3 principal4 0 0.1 2 360 100000 273.643517 273.666321 0.000000 0.000000 1 0.1 4 360 200000 547.287034 547.332642 547.378253 547.423868 列进行比较:< / p>

mask = np.arange(len(df.columns)) > frame['per'].values[:, None] - 1
df[:] = np.where(mask, 0, df)
df = frame.join(df)
print(df)
   rate  per  nper      pv  principal1  principal2  principal3  principal4
0   0.1    2   360  100000  273.643517  273.666321    0.000000    0.000000
1   0.1    4   360  200000  547.287034  547.332642  547.378253  547.423868

使用mask的另一种解决方案:

Sub Calc_DoC()    
    Range("C6:N6").Formula = "=(C5/average(c2:e2))*30"
End Sub