2014-12-04 5 views
1

Учитывая следующие данные:Как перенести целые группы в панд GroupBy

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

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

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

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

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

Я возиться с GroupBy/преобразования/применить, но гаванью» t получил что-нибудь, котор нужно работать до тех пор. Если я GroupBy, а затем перейти, она сдвигает каждую группу, дающую выход:

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

Я мог бы грубой силой его итерация, но я уверен, что есть лучшее решение. Есть идеи?

ответ

0

Это интересная операция. Я могу подумать об альтернативном способе сделать это с помощью 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) шаг.

+0

Интересно ... Я пытаюсь понять, работает ли это для переключения более одного раза и обновляется вопрос, чтобы включить его в – user3738579

+0

@ user3738579 Я отредактировал свой ответ для соответствия. –

+0

ah great- я все еще пытаюсь понять, как это работает, но это явно работает! – user3738579

Смежные вопросы