Python найти второй вхождение набора в столбце - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть фрейм данных:

ID        Status  
100         X  
100         Y  
100         Y  
100         Z  
100         A  
100         Y  
100         Y  
100         Y  
100         X  
100         X  
100         Y  
100         Y  
200         A  
200         B  
200         Y  
200         Y  
200         C  
200         Y  
200         Y   
200         Z   

Для каждого непоследовательного вхождения элемента Y я хочу, чтобы Состояние изменялось в зависимости от того, сколько раз появляется Y.Мой ожидаемый результат:

ID        Status  
100         X  
100         Y  
100         Y  
100         Z  
100         A  
100         Y1  
100         Y1  
100         Y1  
100         X  
100         X  
100         Y2  
100         Y2  
200         A  
200         B  
200         Y  
200         Y  
200         C  
200         Y1  
200         Y1   
200         Z 

Я пробовал следующее:

df['index'] = pd.np.where(df['Status']==Y, df.groupby(['ID']).cumcount(),0)

, который индексирует каждый случай Y. Затем я считаю разницу следующим образом:

df['diff'] = df['index'] - df['index'].shift(1)

Затем я выбираю каждую точку. Df ['diff']> 1 становится новым значением статуса, 'Y1'.

df['Status']=pd.np.where(df['diff']>1, 'Y1', df['Status'])

Выше, однако, идентифицируется каждая точкагде Y встречается.Мне нужно отфильтровать первый раз, когда происходит Y и решить для последующих случаев.Я в порядке даже со следующим выводом:

ID        Status  
100         X  
100         Y  
100         Y  
100         Z  
100         A  
100         Y1  
100         Y1  
100         Y1  
100         X  
100         X  
100         Y1  
100         Y1  
200         A  
200         B  
200         Y  
200         Y  
200         C  
200         Y1  
200         Y1   
200         Z   

1 Ответ

0 голосов
/ 28 ноября 2018

Вот один путь через groupby + transform:

def enum(x):
    mask = x.eq('Y')
    y = mask & x.ne(x.shift())
    z = y.cumsum().sub(1).where(mask).fillna(0).astype(int).astype(str)
    return z.mask(z == '0', '')

df['Status'] += df.groupby('ID')['Status'].transform(enum)

print(df)

     ID Status
0   100      X
1   100      Y
2   100      Y
3   100      Z
4   100      A
5   100     Y1
6   100     Y1
7   100     Y1
8   100      X
9   100      X
10  100     Y2
11  100     Y2
12  200      A
13  200      B
14  200      Y
15  200      Y
16  200      C
17  200     Y1
18  200     Y1
19  200      Z
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...