Панды: разница между группами

1

Привет у меня есть панда 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.

Теги:
pandas

1 ответ

1
Лучший ответ

Создайте столбец "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
  • 0
    Спасибо за ответ, это работает как шарм. Не знал, что можно просто сдвинуть строки и вычислить разницу таким образом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню