Если значения внутри группы равны (но количество строк в группе не равно), вы можете сделать это, вычтя все строки в группе со значением предыдущей группы.
df['X'] - df['Time'].map(df.groupby('Time')['X'].max().shift()).fillna(df['X'])
0 0.0
1 0.0
2 2.0
3 2.0
4 3.0
5 3.0
dtype: float64
Подробности
Первый шаг - найти уникальные значения в каждой группе (я использую max()
, но вы также можете использовать unique()
или first()
):
df.groupby('Time')['X'].max()
Time
1 1
2 3
3 6
Name: X, dtype: int64
Затем сдвиньте их вниз:
_.shift()
Time
1 NaN
2 1.0
3 3.0
Name: X, dtype: float64
Отобразите его обратно в «Время» (группировщик):
df['Time'].map(_)
0 NaN
1 NaN
2 1.0
3 1.0
4 3.0
5 3.0
Name: Time, dtype: float64
Заполните первую группу NaN «Х»:
_.fillna(df['X'])
0 1.0
1 1.0
2 1.0
3 1.0
4 3.0
5 3.0
Name: Time, dtype: float64
Теперь у вас есть RHS. Просто вычтите это из «Х» и все готово.