Суммарное отставание Pandas столбца

Допустим, у меня есть такие данные

df = pd.DataFrame({"MONTHS":[1,2,3,4,5,6], "METRIC":[430,584,648,571,610,535]})

df = pd.DataFrame({"МЕСЯЦА":[1,2,3,4,5,6], "МЕТРИЧЕСКАЯ":[430 584 648 571 610 535]}) что я хочу сделать, это найти сумму столбца метрики = 3378

MONTHS NEW_METRIC
 0       3378
 1       3378
 2       2948
 3       2794
 4       2730
 5       2807
 6       2768

Итак, здесь в основном создана новая строка с добавленным 0, и соответствующая новая метрика представляет собой сумму, а для значения 1 это также сумма для новой метрики, но из месяца = 2 следует вычесть значение задержки метрики (3378-430) и аналогично для месяцев3 это будет (3378-584) и т. д. до конца. В качестве первого шага я хотел сохранить сумму в результате, который не удался

sum_METRIC = df.agg({"METRIC":"sum"}).collect()[0]
result = sum_METRIC["sum(METRIC)"]

Этот объект с ошибкой «Серия» не имеет атрибута «собирать».

Как суммировать, а затем использовать задержку для вычитания?

3
0
479
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Из полученной суммы можно вычесть МЕТРИЧЕСКИЕ:

In [11]: df["METRIC"].sum() - df["METRIC"].reindex(np.arange(0, 7)).shift(2).fillna(0)
Out[11]:
0    3378.0
1    3378.0
2    2948.0
3    2794.0
4    2730.0
5    2807.0
6    2768.0
Name: METRIC, dtype: float64

Не уверен, что вам нужно reindex.

Quang Hoang 30.05.2019 22:28

@QuangHoang без переиндексации вы не начнете с 0 МЕСЯЦЕВ, что соответствует ожидаемым ОП. Да может и не надо...

Andy Hayden 30.05.2019 22:37

Я подумал reindex добавить дополнительную строку, как хочет ОП. Кроме reindex, есть ли другие более короткие способы создания дополнительной строки?

Andy L. 30.05.2019 23:13

@AndyHayden- Спасибо, но есть ли способ динамически указать длину df вместо 7 (длина + 1)?

viji 31.05.2019 16:52

@viji np.arange(df.MONTHS.iloc[0] - 1, df.MONTHS.iloc[-1])

Andy Hayden 31.05.2019 17:26

@AndyHayden, спасибо, только что понял, что замена 7 на len(df)+1 также сработала

viji 31.05.2019 18:44

С использованием

df['New']=df["METRIC"].sum() - np.array([0,0]+df["METRIC"].tolist())[:len(df)]
df
Out[307]: 
   MONTHS  METRIC   New
0       1     430  3378
1       2     584  3378
2       3     648  2948
3       4     571  2794
4       5     610  2730
5       6     535  2807

Другие вопросы по теме