2 votes

Pandas : : Valeurs d'une colonne en tant que colonnes

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 !

1voto

MaxU Points 5284

Vous pouvez procéder de la manière suivante :

In [85]: df.pivot_table(index=df.columns.drop(['event','type']).tolist(),
                        columns='event',
                        values='type',
                        aggfunc='first') \
            .reset_index()
            .rename_axis(None,1)
Out[85]:
   origin_id  serialn  year  month  day X1    X2 X3    X4
0          1      101  2017      6   10  A     A  B  None
1          2      151  2016      7   15  A  None  B     C

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