我正在尝试进行多年财务预测。我需要根据当年的排名来计算支出,然后重新排名并计算明年的支出。
我的数据框中包含汽车零件以及用预算约束来修理/替换它的成本(400美元)一旦花费了预算,那么我就不能再修复那一年的任何其他东西但是它会被重新确定以下内容的优先顺序年。
在第1年,预算仅涵盖传输,但在第2年传输很好,因此它排名最低。如何根据排名直到预算限额运行累计金额?
df
Part Rank(Year 1) Cost(Y1) Spend(Y1) Rank(Y2) Spend(Y2)
Transmission 1 400 400 4 0
Tires 2 400 0 1 400
Windshield 3 100 0 2 0
Wipers 4 20 0 3 0
还想添加:
for val in df['Spend']:
if val.cumsum() >= budget_var:
val = 0
这就是现在的情况,但我需要总和按顺序排列。
答案 0 :(得分:1)
sorted_df = df.sort_values(col_name)
另外,我认为你的cumsum()
是对的;您将其应用于列中的各个值,而不是整个列。
试试这个
df['Spend'] = max(0,df['Cost'].cumsum())
答案 1 :(得分:1)
这样的事情应该有效:
>>> df
Out[]:
Part Rank(Y1) Cost(Y1) Spend(Y1) Rank(Y2)
0 Transmission 1 400 400 4
1 Tires 2 400 0 1
2 Windshield 3 100 0 2
3 Wipers 4 20 0 3
budget_var = 400
df['Spend(Y2)'] = df['Cost(Y1)'].where(df['Cost(Y1)']
[pd.np.argsort(df['Rank(Y2)'])]
.cumsum()
.where(lambda x: x <= budget_var), 0)
>>> df
Out[]:
Part Rank(Y1) Cost(Y1) Spend(Y1) Rank(Y2) Spend(Y2)
0 Transmission 1 400 400 4 0
1 Tires 2 400 0 1 400
2 Windshield 3 100 0 2 0
3 Wipers 4 20 0 3 0
其中:
df['Cost(Y1)']
当然是成本系列where(..., 0)
切片系列并在切片外返回0 df['Cost(Y1)']
也使用费用数据[pd.np.argsort(df['Rank(Y2)'])]
切片Cost(Y1)
根据Rank(Y2)
订单cumsum()
获取已排序成本系列的累积总和where(lambda x: x <= budget_var)
是值小于或等于budget_var
这样,如果累计金额小于预算,则每行的全部费用会显示在Spend
中。
budget_var = 500
会导致
>>> df
Out[]:
Part Rank(Y1) Cost(Y1) Spend(Y1) Rank(Y2) Spend(Y2)
0 Transmission 1 400 400 4 0
1 Tires 2 400 0 1 400
2 Windshield 3 100 0 2 100
3 Wipers 4 20 0 3 0