Python 按等级对数值求和
我想做一个多年的财务预测。我需要根据当年的排名计算支出,然后重新排名并计算下一年的支出 我的数据框中有汽车零件和修复/替换成本,预算有限(400美元)。一旦预算用完,我就不能再修复当年的其他任何东西,但它将在下一年重新确定优先级 在第一年,预算仅涵盖变速箱,但在第二年,变速箱状况良好,因此排名最低。在达到预算限额之前,我如何根据排名计算累计金额Python 按等级对数值求和,python,pandas,numpy,Python,Pandas,Numpy,我想做一个多年的财务预测。我需要根据当年的排名计算支出,然后重新排名并计算下一年的支出 我的数据框中有汽车零件和修复/替换成本,预算有限(400美元)。一旦预算用完,我就不能再修复当年的其他任何东西,但它将在下一年重新确定优先级 在第一年,预算仅涵盖变速箱,但在第二年,变速箱状况良好,因此排名最低。在达到预算限额之前,我如何根据排名计算累计金额 df Part Rank(Year 1) Cost(Y1) Spend(Y1) Rank(Y2) S
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
这就是现在的情况,但我需要按照排名的顺序计算总数
sorted_df = df.sort_values(col_name)
另外,我认为你的cumsum()
是不对的;将其应用于列中的单个值,而不是整个列
试试这个
df['Spend'] = max(0,df['Cost'].cumsum())
像这样的方法应该会奏效:
>>> 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
我是否需要在以后的一年中每次计算时都创建一个新的数据帧?您可以只取一个片段并对该数据帧进行排序,但这将更加复杂,除非数据帧非常大,否则不会有太多好处。因此,例如:sorting_df=df.loc[:,'Rank'].sort_values()df['Spend'][sorting_df.index]=max(0,df['Cost']
>>> 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