Привет у меня есть панда df, который выглядит следующим образом (не реальные данные)
index datedjourney sequence values
1 1 1 120
2 1 1 100
3 1 2 75
4 1 3 50
5 1 3 30
6 1 3 61
7 1 4 40
8 1 4 50
9 2 1 86
10 2 1 40
11 2 2 70
Если я группирую по датированному маршруту и последовательности, как это
df.groupby(['datedjourney', 'sequence'])['values']
Я хочу вычислить разницу между последней строкой в группе и первой строкой во второй группе, чтобы df
выглядел следующим образом
index datedjourney sequence values diff_between_groups
1 1 1 120 NaN
2 1 1 100 NaN
3 1 2 75 -25
4 1 3 50 -25
5 1 3 30 NaN
6 1 3 61 NaN
7 1 4 40 -21
8 1 4 50 NaN
9 2 1 86 NaN
10 2 1 40 NaN
11 2 2 70 30.
Таким образом, значения в строке 2 и строке 3 должны быть вычислены, а разница должна быть сохранена в новом столбце diff_between_groups
в строке 3. А затем разница между строками 3 и 4 и т.д. И я не хочу вычислять разницу между строками 8 и 9 потому что это новый datedjourney
.
Создайте столбец "diff_between_groups", который представляет собой разницу между значениями и значениями, сдвинутыми на одну строку.
Создайте булевскую маску, чтобы найти строки, в которых "datejourney" - то же самое, а "последовательность" отличается от строки выше.
Используйте pandas Series, где функция заменяет значения "diff_between_groups" с использованием маски.
df = pd.DataFrame({'index': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
'datedjourney': [1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2],
'sequence': [1, 1, 2, 3, 3, 3, 4, 4, 1, 1, 2],
'values': [120, 100, 75, 50, 30, 61, 40, 50, 86, 40, 70]})
df['diff_between_groups'] = df['values'] - df['values'].shift()
mask = (df.datedjourney == df.datedjourney.shift()) & (df.sequence != df.sequence.shift())
df['diff_between_groups'] = df['diff_between_groups'].where(mask, np.nan)
print(df)
index datedjourney sequence values diff_between_groups
0 1 1 1 120 NaN
1 2 1 1 100 NaN
2 3 1 2 75 -25.0
3 4 1 3 50 -25.0
4 5 1 3 30 NaN
5 6 1 3 61 NaN
6 7 1 4 40 -21.0
7 8 1 4 50 NaN
8 9 2 1 86 NaN
9 10 2 1 40 NaN
10 11 2 2 70 30.0