Разница между строками в группах с пользовательской первой строкой

#python #pandas

#python #панды

Вопрос:

Я хочу получить изменения в определенном столбце фрейма данных внутри группы. «.diff ()» приближает меня, но мне нужно что-то особенное для первой строки, где оно должно равняться «первому» значению. Я пытаюсь получить столбец «Дельта». Группировка по «Элементу», вычисление «дельты» как разницы в PrEFPx.

Пример:

 Item   |  Month   |   PrEFPx   |  Delta
-----------------------------------------
 1     |    1     |    1000    |  1000
 1     |    2     |    1000    |  0
 1     |    3     |    1000    |  0
 1     |    4     |    1500    |  500
 1     |    5     |    1500    |  0
 1     |    6     |    1500    |  0
 1     |    7     |    3000    |  1500
 2     |    1     |    5000    |  5000
 2     |    2     |    5000    |  0
 2     |    3     |    5000    |  0
 2     |    4     |    5000    |  0
 2     |    5     |    5000    |  0
 2     |    6     |    4000    |  -1000
  

Ответ №1:

Выглядит так groupby().diff , как вы упомянули, за которым следует fillna :

 df['Delta'] = df.groupby('Item')['PrEFPx'].diff().fillna(df['PrEFPx'])
  

Вывод:

     Item  Month  PrEFPx   Delta
0      1      1    1000  1000.0
1      1      2    1000     0.0
2      1      3    1000     0.0
3      1      4    1500   500.0
4      1      5    1500     0.0
5      1      6    1500     0.0
6      1      7    3000  1500.0
7      2      1    5000  5000.0
8      2      2    5000     0.0
9      2      3    5000     0.0
10     2      4    5000     0.0
11     2      5    5000     0.0
12     2      6    4000 -1000.0
  

Или другой, но похожий подход с groupby().shift() :

 df['Delta'] = df['PrEFPx'] - df.groupby('Item')['PrEFPx'].shift(fill_value=0)
  

Вывод:

     Item  Month  PrEFPx  Delta
0      1      1    1000   1000
1      1      2    1000      0
2      1      3    1000      0
3      1      4    1500    500
4      1      5    1500      0
5      1      6    1500      0
6      1      7    3000   1500
7      2      1    5000   5000
8      2      2    5000      0
9      2      3    5000      0
10     2      4    5000      0
11     2      5    5000      0
12     2      6    4000  -1000