J'ai une trame de données qui ressemble à:

sensorId                   1      2      3   

9b:f3:55:19:00:4b:12:00    1      7      8    
bf:f3:55:19:00:4b:12:00    6      5      9   
da:f3:55:19:00:4b:12:00    1      1      2  

Et je veux me restructurer en une trame de données avec la structure suivante:

 sensorId                 y
 9b:f3:55:19:00:4b:12:00  1
 9b:f3:55:19:00:4b:12:00  7
 9b:f3:55:19:00:4b:12:00  8
 bf:f3:55:19:00:4b:12:00  6
 bf:f3:55:19:00:4b:12:00  5
 bf:f3:55:19:00:4b:12:00  9
 da:f3:55:19:00:4b:12:00  1
 da:f3:55:19:00:4b:12:00  1
 da:f3:55:19:00:4b:12:00  2

J'ai essayé d'utiliser df.stack (), mais le résultat n'est pas prometteur, car il renvoie un pd.series:

9b:f3:55:19:00:4b:12:00  1      1
                         2      7
                         3      8
bf:f3:55:19:00:4b:12:00  1      6
                         2      5
                         3      9
da:f3:55:19:00:4b:12:00  1      1
                         2      1
                         3      2
2
zacha2 14 mars 2019 à 12:35

2 réponses

Meilleure réponse

Utilisez le double Series.reset_index - premier pour supprimer le deuxième niveau de MultiIndex et deuxièmement pour convertir Series en DataFrame :

df = df.stack().reset_index(level=1, drop=True).reset_index(name='y')
print (df)
                  sensorId  y
0  9b:f3:55:19:00:4b:12:00  1
1  9b:f3:55:19:00:4b:12:00  7
2  9b:f3:55:19:00:4b:12:00  8
3  bf:f3:55:19:00:4b:12:00  6
4  bf:f3:55:19:00:4b:12:00  5
5  bf:f3:55:19:00:4b:12:00  9
6  da:f3:55:19:00:4b:12:00  1
7  da:f3:55:19:00:4b:12:00  1
8  da:f3:55:19:00:4b:12:00  2

ÉDITER:

Étant donné que df.stack renvoie MultiIndex, cela signifie que sensorId n'est pas une colonne, mais un index.

Si sensorId est la colonne :

df = df.set_index('sensorId').stack().reset_index(level=1, drop=True).reset_index(name='y')
5
jezrael 14 mars 2019 à 09:49

Ou utiliser:

df = df.set_index('sensorId').stack().reset_index(name='y').drop('level_1',1)

Et aussi une petite correction à @ jezrael (c'est sympa):

df = df.set_index('sensorId').stack().reset_index(level=1, drop=True).reset_index(name='y')

Et maintenant:

print(df)

Est:

                  sensorId  y
0  9b:f3:55:19:00:4b:12:00  1
1  9b:f3:55:19:00:4b:12:00  7
2  9b:f3:55:19:00:4b:12:00  8
3  bf:f3:55:19:00:4b:12:00  6
4  bf:f3:55:19:00:4b:12:00  5
5  bf:f3:55:19:00:4b:12:00  9
6  da:f3:55:19:00:4b:12:00  1
7  da:f3:55:19:00:4b:12:00  1
8  da:f3:55:19:00:4b:12:00  2
0
U11-Forward 14 mars 2019 à 09:45