Начните отсчет с нуля по группе - PullRequest
0 голосов
/ 04 мая 2018

Рассмотрим следующий кадр данных:

>>> import pandas as pd
>>> df = pd.DataFrame({'group': list('aaabbabc')})
>>> df
  group
0     a
1     a
2     a
3     b
4     b
5     a
6     b
7     c

Я хочу посчитать, сколько раз каждая группа встречалась. Мой желаемый вывод выглядит так:

>>> df
  group  n
0     a  0
1     a  1
2     a  2
3     b  0
4     b  1
5     a  3
6     b  2
7     c  0

Мой первоначальный подход был сделать что-то вроде этого:

df['n'] = df.groupby('group').apply(lambda x: list(range(x.shape[0])))

В основном, присваивая массиву n нулевой индекс каждой группе. Но это оказалось трудно перенести и присоединиться.

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

Просто используйте groupby для имени столбца, в этом случае group, затем примените cumcount и, наконец, добавьте столбец в dataframe с результатом.

df['n']=df.groupby('group').cumcount()

 group  n
0   a   0
1   a   1
2   a   2
3   b   0
4   b   1
5   a   3
6   b   2
7   c   0
0 голосов
/ 04 мая 2018

Вы можете использовать метод apply, передав в качестве параметра выражение lambda.

Идея состоит в том, что вам нужно найти count для group как число появлений для этого group из предыдущих строк.

df['n'] = df.apply(lambda x: list(df['group'])[:int(x.name)].count(x['group']), axis=1)

выход

  group  n
0     a  0
1     a  1
2     a  2
3     b  0
4     b  1
5     a  3
6     b  2
7     c  0

Примечание : метод cumcount строится с помощью функции apply.

Вы можете прочитать это в документации для панд .

0 голосов
/ 04 мая 2018

Вы можете использовать groupby + cumcount, а по горизонтали concat новый столбец:

>>> pd.concat([df, df.group.groupby(df.group).cumcount()], axis=1).rename(columns={0: 'n'})
    group   n
0   a   0
1   a   1
2   a   2
3   b   0
4   b   1
5   a   3
6   b   2
7   c   0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...