Как рассчитать количество в одной группе на основе идентификатора - PullRequest
1 голос
/ 04 августа 2020

Мой DataFrame выглядит так:

df = pd.DataFrame({"ID":['A','B','A','A','B','B','C','D','D','C'], 
                   'count':[1,1,2,2,2,2,1,1,1,2]})
print(df)
  ID  count
0  A      1
1  B      1
2  A      2
3  A      2
4  B      2
5  B      2
6  C      1
7  D      1
8  D      1
9  C      2

У меня будет только столбец ID, и я хочу вычислить столбец count. Лог c - я хочу кумулятивно подсчитать появление ID. Если его сразу же повторить, как index 2 & 3, они оба должны получить одинаковый счет. Как я могу этого добиться?

Моя попытка, которая не дает точных результатов:

df['x'] = df['ID'].eq(df['ID'].shift(-1)).astype(int)
df.groupby('ID')['x'].transform('cumsum')+1
0    1
1    1
2    2
3    2
4    2
5    2
6    1
7    2
8    2
9    1
Name: x, dtype: int32 

Вопрос не имеет прямого отношения к групповому кумулятивному подсчету, но он другой.

Ответы [ 2 ]

5 голосов
/ 04 августа 2020

Можем сделать filter затем reindex назад

(df[df.ID.ne(df.ID.shift())].groupby('ID').cumcount().add(1)
                            .reindex(df.index,method='ffill'))
Out[10]: 
0    1
1    1
2    2
3    2
4    2
5    2
6    1
7    1
8    1
9    2
dtype: int64
0 голосов
/ 04 августа 2020

Вы также можете использовать groupby() с sort=False:

df['count2'] = df[(df.ID.ne(df.ID.shift()))].groupby('ID', sort=False).cumcount().add(1)
df['count2'] = df['count2'].ffill() 

Вывод :

  ID  count  count2
0  A      1       1
1  B      1       1
2  A      2       2
3  A      2       2
4  B      2       2
5  B      2       2
6  C      1       1
7  D      1       1
8  D      1       1
9  C      2       2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...