Счетчик выполнения с условием покоя в другой строке последовательно - PullRequest
0 голосов
/ 09 июля 2020

У меня есть фрейм данных, в котором я хочу продолжать увеличивать значение до тех пор, пока val не изменится, а когда id изменения не сбросят count значение

data = [['p1','1'],
        ['p1','1'],
        ['p1','2'],
        ['p2','3'],
        ['p2','5'],
        ['p3','2'],
        ['p2','3'],
        ['p2','4']]

df = pd.DataFrame(data = data,columns = ['id','val'])

Желаемый результат

   id val  count
0  p1   1      1
1  p1   1      1
2  p1   2      2
3  p2   3      1
4  p2   5      2
5  p3   2      1
6  p2   3      1
7  p2   4      2

Когда я делаю groupby, чем transform

df['count']=df.groupby('id').val.transform(lambda x : x.factorize()[0]+1)

, если вы видите, что проблема только с выходом - это последняя строка, вы увидите счетчик 3, поскольку он группируется, он суммируется с предыдущим p2, но я хочу игнорируйте это и позвольте полностью сбросить и увеличивать счет последовательно, а не целую группу.

   id val  count
0  p1   1      1
1  p1   1      1
2  p1   2      2
3  p2   3      1
4  p2   5      2
5  p3   2      1
6  p2   3      1
7  p2   4      3

1 Ответ

1 голос
/ 09 июля 2020

Вы можете передать настраиваемую серию, созданную сравнением Series.ne, если не равно Series.shift, а совокупную сумму Series.cumsum:

g = df['id'].ne(df['id'].shift()).cumsum()
df['count']=df.groupby(g).val.transform(lambda x : x.factorize()[0]+1)

print (df)
   id val  count
0  p1   1      1
1  p1   1      1
2  p1   2      2
3  p2   3      1
4  p2   5      2
5  p3   2      1
6  p2   3      1
7  p2   4      2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...