Как переместить целые группы в pandas groupby

Учитывая следующие данные:

data = {'a' : [1,1,1,8,8,3,3,3,3,4,4] }
df = pd.DataFrame(data)

Теперь я хотел бы сместить все это вниз на n групп, чтобы сохранить их текущий порядок. Желаемый результат для сдвига n = 1 будет следующим:

desired_output = {'a': [NaN,NaN,NaN,1,1,8,8,8,8,3,3] }
desired_output_df = pd.DataFrame(desired_output)

сдвиг n=2 должен быть:

desired_output = {'a': [NaN,NaN,NaN,NaN,NaN,1,1,1,1,8,8] }
desired_output_df = pd.DataFrame(desired_output)

Я возился с groupby/transform/apply, но пока ничего не получилось. Если я группирую, а затем сдвигаю, он сдвигает каждую группу, давая результат:

NOT_desired_output = {'a' : [NaN, 1, 1, NaN, 8, NaN, 3,3,3, NaN, 4]}

Я мог бы использовать грубую силу путем повторения, но я уверен, что есть лучшее решение. Любые идеи?


person user3738579    schedule 04.12.2014    source источник


Ответы (1)


Это интересная операция. Я могу придумать альтернативный способ сделать это с помощью replace.

Для перехода на 1 группу:

>>> df['b'] = df.a.shift()
>>> x = df[df.a != df.b]
>>> df.replace(*x.values.T)

Что дает DataFrame:

     a   b
0  NaN NaN
1  NaN NaN
2  NaN NaN
3    1 NaN
4    1   1
5    8   1
6    8   8
7    8   8
8    8   8
9    3   8
10   3   3

И нам просто нужен столбец a этого DataFrame:

desired_output_df = pd.DataFrame(_, columns=['a'])

Чтобы сдвинуть более чем на одну группу, вам просто нужно сдвинуть столбец b из x. Если вы хотите сдвинуться на n групп, вам нужно сдвинуть x.b еще n-1 раз. Просто вставьте строку

>>> x.b = x.b.shift(n-1)

после x = df[df.a != df.b], а затем выполните шаг df.replace(*x.values.T).

person Alex Riley    schedule 04.12.2014
comment
Интересно - я пытаюсь посмотреть, работает ли это для переключения более одного раза и обновить вопрос, чтобы включить это - person user3738579; 05.12.2014
comment
о, отлично, я все еще пытаюсь понять, как именно это работает, но это явно работает! - person user3738579; 05.12.2014
comment
(*x.values.T) — это кортеж, распаковывающий массив NumPy по столбцу (см. этот ответ для объяснения). По сути, он использует столбцы a и b для соответствующих списков поиска/замены. - person Alex Riley; 05.12.2014