Как сдвинуть столбец в группе данных pandas, а затем снова объединиться в один кадр данных? - PullRequest
0 голосов
/ 22 февраля 2019

если у меня есть такой фрейм данных:

category name index 
A        A11   1
A        A12   1
A        A13   1
A        A21   2
A        A22   2
A        A23   2
...
B        B11   1
B        B21   2
...

Я хочу сначала сгруппировать фрейм данных по категории и индексу, а внутри каждой группы я хочу сместить столбец name на значениеindex (обратное смещение) - 1.

Таким образом, результат будет выглядеть следующим образом:

category name index 
A        A11   1    # Do not shift anything because index is 1
A        A12   1
A        A13   1
A        A22   2    # Shift -1 for anything in (A, 2) group because index here is 2
A        A23   2
A        A24   2
...
B        B11   1
B        NA    2  # at the end of each group it should be NA

Я пытался использовать .groupby (), а затем .apply (), но кажется, что тамЭто не простой способ присоединить результат обратно к кадру данных.Кажется, что метод apply может возвращать только серию.Как я могу добиться этого с помощью метода apply?

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Один способ, которым я думаю, что вы можете сделать это, если я правильно понимаю:

Учитывая df,

  category name  index
0        A  A11      1
1        A  A12      1
2        A  A13      1
3        A  A21      2
4        A  A22      2
5        A  A23      2
6        B  B11      1
7        B  B21      2

Используйте запрос, чтобы фильтровать, где индекс не равен 1, затем сдвиг в пределах groupby и конкатная часть фрейма данных фильтра, где индекс равен 1 смещенному фрейму данных.

df_shifted = (df.query("index > 1").groupby(['category','index'])
                                   .apply(lambda x: x['name'].shift(-1))
                .reset_index().set_index('level_2').rename_axis(None))

df_out = pd.concat([df_shifted, df.query("index == 1")], sort=False).sort_index()
df_out

Вывод:

  category  index name
0        A      1  A11
1        A      1  A12
2        A      1  A13
3        A      2  A22
4        A      2  A23
5        A      2  NaN
6        B      1  B11
7        B      2  NaN
0 голосов
/ 22 февраля 2019

Если я понимаю ваш вопрос

l=[y.assign(name=y.name.shift(-x[1]+1).values) for x , y in df.groupby(['category','index'])]

Newdf=pd.concat(l)
Newdf
Out[644]: 
  category name  index
0        A  A11      1
1        A  A12      1
2        A  A13      1
3        A  A23      2
4        A  A24      2
5        A  NaN      2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...