Python 按等级对数值求和

Python 按等级对数值求和,python,pandas,numpy,Python,Pandas,Numpy,我想做一个多年的财务预测。我需要根据当年的排名计算支出,然后重新排名并计算下一年的支出 我的数据框中有汽车零件和修复/替换成本,预算有限(400美元)。一旦预算用完,我就不能再修复当年的其他任何东西,但它将在下一年重新确定优先级 在第一年,预算仅涵盖变速箱,但在第二年,变速箱状况良好,因此排名最低。在达到预算限额之前,我如何根据排名计算累计金额 df Part Rank(Year 1) Cost(Y1) Spend(Y1) Rank(Y2) S

我想做一个多年的财务预测。我需要根据当年的排名计算支出,然后重新排名并计算下一年的支出

我的数据框中有汽车零件和修复/替换成本,预算有限(400美元)。一旦预算用完,我就不能再修复当年的其他任何东西,但它将在下一年重新确定优先级

在第一年,预算仅涵盖变速箱,但在第二年,变速箱状况良好,因此排名最低。在达到预算限额之前,我如何根据排名计算累计金额

   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