2017-08-29 8 views
1

J'ai une trame de données et je veux compter le nombre d'entrées consécutives d'une colonne et enregistrer les comptes dans une variable distincte. Voici un exemple:Comptage des entrées précédentes d'une colonne et création d'une nouvelle variable de ces comptes

ID Class  
1  A   
1  A   
2  A   
1  B   
1  B   
1  B   
2  B   
1  C   
1  C   
2  A   
2  A   
2  A   

Je veux dans chaque ID groupe pour compter le nombre de classes consécutives, de sorte que la sortie devrait ressembler à ceci:

ID Class Counts 
1  A  0 
1  A  1 
2  A  0 
1  B  0 
1  B  1 
1  B  2 
2  B  0 
1  C  0 
1  C  1 
2  A  0 
2  A  1 
2  A  2 

Je ne cherche pas la fréquence d'apparition de une des entrées spécifiques comme here plutôt les occurrences consécutives d'une entrée au niveau de l'ID

Répondre

3

Vous pouvez utiliser cumcount par Series qui est crée par cumsum des valeurs décalées de concanecate shift:

#use separator which is not in data like _ or ¥ 
s = df['ID'].astype(str) + '¥' + df['Class'] 
df['Counts'] = df.groupby(s.ne(s.shift()).cumsum()).cumcount() 
print (df) 
    ID Class Counts 
0 1  A  0 
1 1  A  1 
2 2  A  0 
3 1  B  0 
4 1  B  1 
5 1  B  2 
6 2  B  0 
7 1  C  0 
8 1  C  1 
9 2  A  0 
10 2  A  1 
11 2  A  2 

Une autre solution avec ngroup (pandas 0.20.2+):

s = df.groupby(['ID','Class']).ngroup() 
df['Counts'] = df.groupby(s.ne(s.shift()).cumsum()).cumcount() 
print (df) 
    ID Class Counts 
0 1  A  0 
1 1  A  1 
2 2  A  0 
3 1  B  0 
4 1  B  1 
5 1  B  2 
6 2  B  0 
7 1  C  0 
8 1  C  1 
9 2  A  0 
10 2  A  1 
11 2  A  2