Это должно работать:
Сортировать значения в df по всем столбцам, включая qty
, чтобы diff всегда было положительным.
df = df.sort_values(by=['dc','region','banner','input_date','week','qty','general'])
Установите индекс и группу по столбцам, которые вы хотите сравнить. Для каждой группы получите diff()
и dropna()
(это исключить одинаковые строки группы) и reset_index
, чтобы получить все столбцы. Теперь это даст вам фрейм данных с совпадающими строками и qty
с diff()
df2 = df.set_index(compare_cols).groupby(compare_cols)['qty'].diff().dropna().reset_index()
df2['general'] = 'sub_output'
print(df2)
Вывод:
dc region banner input_date week general qty
0 ABC NE XYZ 2020-03-01 2020-01-02 sub_output 31.0
1 ABC NE XYZ 2020-03-01 2020-01-03 sub_output 9.0
2 PQR SE GHQ 2020-03-01 2020-01-04 sub_output 15.0
Наконец, объедините ваш оригинальный df с этим сгруппированный df с diff
df = (df.reset_index().merge(df2, how='outer').drop('index', axis=1))
print(df)
Выход:
dc region banner input_date week qty general
0 ABC NE XYZ 2020-03-01 2020-01-02 130 dc_input
1 ABC NE XYZ 2020-03-01 2020-01-02 161 dc_input
2 ABC NE XYZ 2020-03-01 2020-01-03 158 dc_input
3 ABC NE XYZ 2020-03-01 2020-01-03 167 dc_input
4 PQR SE GHQ 2020-03-01 2020-01-04 100 dc_input
5 PQR SE GHQ 2020-03-01 2020-01-04 115 dc_input
6 ABC NE XYZ 2020-03-01 2020-01-02 31 sub_output
7 ABC NE XYZ 2020-03-01 2020-01-03 9 sub_output
8 PQR SE GHQ 2020-03-01 2020-01-04 15 sub_output