Совокупный подсчет значений с группировкой с использованием панд - PullRequest
3 голосов
/ 17 октября 2019

У меня есть следующий DataFrame:

>>>> df = pd.DataFrame(data={
            'type': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'],
            'value': [0, 2, 3, 4, 0, 3, 2, 3, 0]})

>>> df
  type  value
0    A      0
1    A      2
2    A      3
3    B      4
4    B      0
5    B      3
6    C      2
7    C      3
8    C      0

Что мне нужно сделать, это следующее: для каждого типа отслеживать совокупное число ненулевых значений, но начиная с нуля каждый раз, когда 0-значениевстречается.

  type  value  cumcount
0    A      0         NaN
1    A      2         1
2    A      3         2
3    B      4         1
4    B      0         NaN
5    B      3         1
6    C      2         1
7    C      3         2
8    C      0         NaN

1 Ответ

6 голосов
/ 17 октября 2019

Идея состоит в том, чтобы создавать последовательные группы и отфильтровывать не 0 значения, последний присваивать новый столбец с фильтром:

m = df['value'].eq(0)
g = m.ne(m.shift()).cumsum()[~m]

df.loc[~m, 'new'] = df.groupby(['type',g]).cumcount().add(1)
print (df)
  type  value  new
0    A      0  NaN
1    A      2  1.0
2    A      3  2.0
3    B      4  1.0
4    B      0  NaN
5    B      3  1.0
6    C      2  1.0
7    C      3  2.0
8    C      0  NaN

Для панд 0,24+ возможно использование Обнуляемый целочисленный тип данных :

df['new'] = df['new'].astype('Int64')
print (df)
  type  value  new
0    A      0  NaN
1    A      2    1
2    A      3    2
3    B      4    1
4    B      0  NaN
5    B      3    1
6    C      2    1
7    C      3    2
8    C      0  NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...