Как вычислить разницу между строками в фрейме данных?
Есть фрейм данных с данными об аффилиатах, офферах, кликах и т.д.
Я хочу посчитать разницу в конверсиях (столбец Appr) между вчерашним и сегодняшним днем по каждому офферу + аффилиату, и добавить разницу в столбец DiffAppr.
Исходный фрейм данных выглядит так:
| D | H | AfID | Affil_name | M | OfID | Offer_name | Clicks | Revenue | Earnings | Appr | Decl | CR | Tr-back |
|----|----|------|------------|-------|------|-------------|--------|---------|----------|------|------|-------|---------|
| 28 | 11 | 340 | alex | T | 2132 | FlashPlaye | 10000 | 0 | 0 | 100 | 0 | 1:100 | 0 |
| 29 | 11 | 528 | ido | Marti | 2587 | Amazon_S | 20400 | 0 | 0 | 68 | 0 | 1:300 | 0 |
| 29 | 11 | 340 | alex | T | 2132 | FlashPlayer | 2800 | 3 | 0,6 | 200 | 0 | 1:14 | 0 |
Я применяю функцию diff() + groupby():
df['Diff'] = df.groupby(['H', 'AfID', 'Affil_name', 'M', 'OfID','Offer_name'])['Appr'].diff().fillna(0)
Результат такой:
| D | H | AfID | Affil_name | M | OfID | Offer_name | Clicks | Revenue | Earnings | Appr | Decl | CR | Tr-back | Diff |
|:--:|:--:|:----:|:----------:|:-----:|:----:|:----------:|:------:|:-------:|:--------:|:----:|:----:|:-----:|:-------:|:----:|
| 28 | 11 | 340 | alex | T | 2132 | FlashPlaye | 10000 | 0 | 0 | 100 | 0 | 1:100 | 0 | 0 |
| 29 | 11 | 528 | ido | Marti | 2587 | Amazon_S | 20400 | 0 | 0 | 68 | 0 | 1:300 | 0 | 0 |
| 29 | 11 | 340 | alex | T | 2132 | FlashPlaye | 10000 | 0 | 0 | 200 | 0 | 1:100 | 0 | 100 |
Т.е., если в фрейме данных нет данных за предыдущий день по этому офферу+аффилиату (2 строка), то эта строка игнорируется и не вычисляется, хотя за сегодняшний день Appr=68, значит в DiffAppr должно быть 68.
Как могу это сделать?
Ответы (1 шт):
Автор решения: MaxU
→ Ссылка
Попробуйте так:
Исходный DataFrame:
In [43]: df
Out[43]:
D H AfID Affil_name M OfID Offer_name Clicks Revenue Earnings Appr Decl CR Tr-back
0 28 11 340 alex T 2132 FlashPlayer 10000 0 0 100 0 1:100 0
1 29 11 528 ido Marti 2587 Amazon_S 20400 0 0 68 0 1:300 0
2 29 11 340 alex T 2132 FlashPlayer 2800 3 0,6 200 0 1:14 0
Решение:
idx = df.reset_index().groupby(['H', 'AfID', 'Affil_name', 'M', 'OfID','Offer_name'])["index"].last().to_numpy()
df['Diff'] = df.groupby(['H', 'AfID', 'Affil_name', 'M', 'OfID','Offer_name'])['Appr'].diff()
df.loc[idx, "Diff"] = df.loc[idx, "Diff"].combine_first(df.loc[idx, "Appr"])
Результат:
In [47]: df
Out[47]:
D H AfID Affil_name M OfID Offer_name Clicks Revenue Earnings Appr Decl CR Tr-back Diff
0 28 11 340 alex T 2132 FlashPlayer 10000 0 0 100 0 1:100 0 NaN
1 29 11 528 ido Marti 2587 Amazon_S 20400 0 0 68 0 1:300 0 68.0
2 29 11 340 alex T 2132 FlashPlayer 2800 3 0,6 200 0 1:14 0 100.0