2 votes

créer une colonne 'numéro de groupe' pour un cadre de données pandas colonne de '0' et '1' s

Comment obtenir le cadre de données ci-dessous

dd = pd.DataFrame({'val':[0,0,1,1,1,0,0,0,0,1,1,0,1,1,1,1,0,0],
             'groups':[1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,'ignore','ignore']})

     val    groups
0     0       1
1     0       1
2     1       1
3     1       1
4     1       1
5     0       2
6     0       2
7     0       2
8     0       2
9     1       2
10    1       2
11    0       3
12    1       3
13    1       3
14    1       3
15    1       3
16    0  ignore
17    0  ignore

J'ai une série df.val avec a des valeurs [0,0,1,1,1,0,0,0,0,1,1,0,1,1,1,1,0,0] .
Comment créer df.groups de df.val .

premièrement 0,0,1,1,1 formeront un groupe 1 ,( c'est-à-dire du début jusqu'à la prochaine occurrence de 0 après 1 's )
0,0,0,0,1,1 formeront un groupe 2 (numéro de groupe incrémentiel, commençant là où le groupe précédent s'est terminé jusqu'à l'occurrence suivante de 0 après 1 ),...etc

Quelqu'un peut-il m'aider ?

2voto

jezrael Points 290608

Premier test si la valeur suivante après 0 es 1 et créer des groupes par sommes cumulées par Series.cumsum :

s = (dd['val'].eq(0) & dd['val'].shift().eq(1)).cumsum().add(1)

Puis convertir le dernier groupe en ignore si la dernière valeur des données est 0 con numpy.where :

mask = s.eq(s.max()) & (dd['val'].iat[-1] == 0)
dd['new'] = np.where(mask, 'ignore', s)
print (dd)
    val  groups     new
0     0       1       1
1     0       1       1
2     1       1       1
3     1       1       1
4     1       1       1
5     0       2       2
6     0       2       2
7     0       2       2
8     0       2       2
9     1       2       2
10    1       2       2
11    0       3       3
12    1       3       3
13    1       3       3
14    1       3       3
15    1       3       3
16    0  ignore  ignore
17    0  ignore  ignore

1voto

W-B Points 94428

IIUC d'abord nous faisons diff y cumsum alors nous devons trouver la condition pour ignorer la valeur précédente que nous obtenons ( np.where )

s=df.val.diff().eq(-1).cumsum()+1
df['New']=np.where(df['val'].eq(1).groupby(s).transform('any'),s,'ignore')
df
    val  groups     New
0     0       1       1
1     0       1       1
2     1       1       1
3     1       1       1
4     1       1       1
5     0       2       2
6     0       2       2
7     0       2       2
8     0       2       2
9     1       2       2
10    1       2       2
11    0       3       3
12    1       3       3
13    1       3       3
14    1       3       3
15    1       3       3
16    0  ignore  ignore
17    0  ignore  ignore

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X