2017-09-13 3 views
1

다년 재무 예측을하려고합니다. 그 해의 순위에 따라 지출을 계산 한 다음 내년에 지출을 다시 계산하고 계산해야합니다.팬더 순위 별 합계

내 데이터 프레임에는 자동차 부품이 들어있어 제한된 예산 (400 달러)으로 수정/교체해야합니다. 예산이 지출되면 더 이상 그 해에는 수정할 수 없지만 해당 예산에 우선 순위가 다시 적용됩니다. 다음 해.

1 년 동안 예산은 전송량 만 다루지 만 2 년차에는 전송량이 좋으므로 가장 낮은 순위에 있습니다. 예산 한도까지 순위에 따라 누적 합계를 계산하려면 어떻게해야합니까?

for val in df['Spend']: 
     if val.cumsum() >= budget_var: 
      val = 0 

이가 지금 얼마나하지만 난이 순위의 순서로 합이 필요합니다

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 

또한 추가 할.

답변

1
sorted_df = df.sort_values(col_name) 

또한 귀하의 cumsum()이 옳다고 생각하지 않습니다. 전체 열이 아닌 열의 개별 값에 적용 할 수 있습니다.

작동해야이 같은이

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

budget_var = 500은 이어질 것인가? – EEPBAH

+0

슬라이스를 가져 와서 해당 데이터 프레임을 정렬 할 수는 있지만 데이터 프레임이 실제로 커지면 훨씬 더 복잡하고 많은 이점은 없을 것입니다. 예 : – Acccumulation

+0

sorting_df = df.loc sort_values ​​() df [ '지출'] [sorting_df.index] = 최대 (0, df [ '비용'] – 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 outsid 즉 슬라이스
  • df['Cost(Y1)']
  • [pd.np.argsort(df['Rank(Y2)'])] 슬라이스 Cost(Y1)Rank(Y2) 순서에 따라 주문 비용 데이터를 사용
  • cumsum() 정렬 선정 시리즈
  • where(lambda x: x <= budget_var)의 누적 합이 작거나 같은 값 부울 마스크이다 얻을 budget_var

누적 합계는 버지 미만인 경우, 각 행의 전체 비용 Spend에 표시되는이 방법 티. 나는 새로운 데이터 프레임을 내가 추가 1 년 동안 계산 때마다해야 할 것이다

>>> 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