2017-09-13 64 views
1

我正在嘗試做一個多年的財務預測。我需要根據當年的排名來計算支出,然後重新排名並計算下一年的支出。按熊貓排名求和值

我的數據框有汽車零件和修理費用(用一個約束預算代替它)(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 

這是怎麼回事,但現在我需要的總和是在排名順序。

回答

1
sorted_df = df.sort_values(col_name) 

此外,我不認爲你的cumsum()是正確的;您將它應用於列中的各個值,而不是整個列。

試試這個

df['Spend'] = max(0,df['Cost'].cumsum()) 
+0

請問我有我每次計算額外一年的時間,使一個新的數據幀? – EEPBAH

+0

您可以對數據幀進行分片並對其進行排序,但這會更復雜,除非數據幀非常大,否則不會有太多好處。因此,例如: – Acccumulation

+0

sorting_df = df.loc [:,'Rank']。sort_values() df ['Spend'] [sorting_df.index] = max(0,df ['Cost'] – Acccumulation

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 outid È切片
  • 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