#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