Вычесть строку из предыдущей строки, которая имеет значение из предыдущей группы в DataFrame

#python #pandas #dataframe #machine-learning #deep-learning

#python #pandas #dataframe #машинное обучение #глубокое обучение

Вопрос:

У меня есть фрейм данных pandas в Python, как показано ниже:

    A   --  E    user
0  0   --  0   1
1  12  --  1   1
2  12  --  1   1
3  13  --  2   1
4  15  --  3   1
5  15  --  3   1
6  15  --  3   1
7  19  --  4   2
8  20  --  5   2
9  25  --  6   2
10 25  --  6   2
  

Я хочу вычесть 1 строку из предыдущей группы / набора значений (т. Е. Она не должна быть 0) [groupby E] для каждого пользователя

Я имею в виду, чтобы иметь DataFrame, как показано ниже:

    A            --  E   user
0  0            --  0   1
1  12           --  1   1
2  12           --  1   1
3  1(ie,13-12)  --  2   1
4  2 (  --   )  --  3   1
5  2            --  3   1
6  2            --  3   1
7  19           --  4   2 (should not change at user 2) 
8  1            --  5   2
9  5(ie,25-20)  --  6   2
10 5(ie,25-20)  --  6   2
  

Не могли бы вы мне помочь .. Спасибо

Ответ №1:

Если в E столбце используются уникальные группы DataFrameGroupBy.diff , замените неправильные значения на исходные Series.fillna и используйте Series.where с маской для последовательных значений (сравниваются для неравных сдвинутых значений), а затем перенаправьте заполнение пропущенных значений на ffill и, наконец, на целые числа:

 df['A1'] = (df.groupby('user')['A'].diff()
              .fillna(df['A'])
              .where(df['E'].ne(df['E'].shift()))
              .ffill()
              .astype(int))
print (df)
     A  E  user  A1
0    0  0     1   0
1   12  1     1  12
2   12  1     1  12
3   13  2     1   1
4   15  3     1   2
5   15  3     1   2
6   15  3     1   2
7   19  4     2  19
8   20  5     2   1
9   25  6     2   5
10  25  6     2   5
  

Комментарии:

1. @TimothyAlexJohn — Какая-то проблема?

2. Я пропустил еще один столбец, который правильно объясняет мою проблему .. можете ли вы проверить мое обновление? мне очень жаль.. Я узнал об этом только тогда, когда применил его к своему dataframe.

3. Спасибо!! Я проверяю result..it занимает много времени, потому что это большой фрейм данных.. Я обновлю, когда результат будет правильным!! Спасибо за вашу большую помощь..

4. Это сработало отлично!! есть ли какой-нибудь способ дать вам сто голосов… вы так помогли.. Спасибо