按大熊猫等级排序值

时间:2017-09-13 20:32:44

标签: python pandas numpy

我正在尝试进行多年财务预测。我需要根据当年的排名来计算支出,然后重新排名并计算明年的支出。

我的数据框中包含汽车零件以及用预算约束来修理/替换它的成本(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

这就是现在的情况,但我需要总和按顺序排列。

2 个答案:

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