Панды: GroupBy Shift и накопленная сумма - PullRequest
0 голосов
/ 05 марта 2019

Я хочу сделать groupby, shift и cumsum, что кажется довольно тривиальной задачей, но все еще ломает голову над результатом, который я получаю.Может кто-нибудь подскажите пожалуйста, что я делаю не так.Все результаты, которые я нашел в Интернете, показывают то же или то же самое изменение того, что я делаю.Ниже моя реализация.

temp = pd.DataFrame(data=[['a',1],['a',1],['a',1],['b',1],['b',1],['b',1],['c',1],['c',1]], columns=['ID','X'])

temp['transformed'] = temp.groupby('ID')['X'].cumsum().shift()
print(temp)

   ID   X   transformed
0   a   1   NaN
1   a   1   1.0
2   a   1   2.0
3   b   1   3.0
4   b   1   1.0
5   b   1   2.0
6   c   1   3.0
7   c   1   1.0

Это неправильно, потому что фактическое или то, что я ищу, как показано ниже:

   ID   X   transformed
0   a   1   NaN
1   a   1   1.0
2   a   1   2.0
3   b   1   NaN
4   b   1   1.0
5   b   1   2.0
6   c   1   NaN
7   c   1   1.0

Заранее большое спасибо.

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Вы можете использовать transform() для подачи отдельных групп, созданных на каждом уровне groupby, в методы cumsum() и shift().

temp['transformed'] = \
    temp.groupby('ID')['X'].transform(lambda x: x.cumsum().shift())
  ID  X   transformed
0  a  1   NaN
1  a  1   1.0
2  a  1   2.0
3  b  1   NaN
4  b  1   1.0
5  b  1   2.0
6  c  1   NaN
7  c  1   1.0

Подробнее о transform() см. Здесь:

0 голосов
/ 05 марта 2019

Вам необходимо использовать apply, поскольку одна функция находится под groupby object, что составляет cumsum, другая функция shift предназначена для всех df

temp['transformed'] = temp.groupby('ID')['X'].apply(lambda x  : x.cumsum().shift())
temp
Out[287]: 
  ID  X  transformed
0  a  1          NaN
1  a  1          1.0
2  a  1          2.0
3  b  1          NaN
4  b  1          1.0
5  b  1          2.0
6  c  1          NaN
7  c  1          1.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...