Les données se présentent comme suit :
origin_id type serialn event year month day
1 A 101 X1 2017 6 10
1 A 101 X2 2017 6 10
1 B 101 X3 2017 6 10
2 A 151 X1 2016 7 15
2 B 151 X3 2016 7 15
2 C 151 X4 2016 7 15
Et j'ai besoin qu'il en soit ainsi :
origin_id serialn X1 X2 X3 X4 year month day
1 101 A A B null 2017 6 10
2 151 A null B C 2016 7 15
Ce dont j'ai besoin, c'est d'utiliser les valeurs de la colonne event
comme en-têtes et mettre la valeur de la colonne type
pour chaque événement, lorsqu'il n'y a pas d'événement pour une certaine période. origin_id
mettre une nullité. D'autres colonnes de la base de données, comme serialn
y origin_id
devrait se trouver dans la version résultante. De même, il ne doit y avoir qu'une seule ligne pour chaque origin_id
Cette question : Comment faire pivoter un cadre de données aborde certains points, bien qu'il soit orienté vers la réalisation d'une agrégation à un moment donné.
C'est une solution possible.
J'obtiens un fichier de données avec l'identifiant d'origine comme index, les événements comme colonnes et les types comme valeurs.
stat = df.pivot(values='type', index='origin_id', columns='event')
Maintenant, j'ai besoin de certaines informations du cadre de données original, donc je ne garde qu'un événement pour chaque identifiant d'origine et je supprime les colonnes que je n'utiliserai pas.
df1 = df.drop_duplicates(subset='origin_id').drop(['type','event'], axis=1)
Fusionner les deux cadres de données, df1 en utilisant les valeurs de origin_id et stat en utilisant l'index.
pd.merge(df1, stat, how='inner', left_on = 'origin_id', right_index = True)
En utilisant la première base de données avec le code ci-dessus, j'obtiens le résultat suivant :
origin_id serialn X1 X2 X3 X4 year month day
1 101 A A B null 2017 6 10
2 151 A null B C 2016 7 15
Existe-t-il un autre moyen de procéder ?
Merci de votre attention !