2017-09-06 1 views
-1

J'ai une collection de mesures sous divers paramètres stockés comme une liste de dicts et convertis en un DataFrame.Python Pandas Reshape Dataframe

import pandas as pd 
data = [{"Device": "A", "temperature": 0, "Load": 1, "Voltage": 5, "Measurement1": 0.1, "Measurement2": 0.9}, 
{"Device": "A", "temperature": 0, "Load": 2, "Voltage": 5, "Measurement1": 0.5, "Measurement2": 1.3}, 
{"Device": "A", "temperature": 40, "Load": 1, "Voltage": 5, "Measurement1": 0.2, "Measurement2": 1}, 
{"Device": "A", "temperature": 40, "Load": 2, "Voltage": 5, "Measurement1": 0.6, "Measurement2": 1.4}, 
{"Device": "B", "temperature": 0, "Load": 1, "Voltage": 5, "Measurement1": 0.3, "Measurement2": 1.1}, 
{"Device": "B", "temperature": 0, "Load": 2, "Voltage": 5, "Measurement1": 0.7, "Measurement2": 1.5}, 
{"Device": "B", "temperature": 40, "Load": 1, "Voltage": 5, "Measurement1": 0.4, "Measurement2": 1.2}, 
{"Device": "B", "temperature": 40, "Load": 2, "Voltage": 5, "Measurement1": 0.8, "Measurement2": 1.6}] 

df = pd.DataFrame(data, columns=['Device', 'temperature', 'Load', 'Voltage', 'Measurement1', 'Measurement2']) 
df 

Initial data Jupyter output

C'est une capture d'écran de la desired structure.

J'ai essayé un tableau croisé dynamique, car l'idée est assez similaire, avec des colonnes/index/valeurs comme paramètres, ainsi que des colonnes séparées de transposition/réindexation/définition mais je n'ai pas pu obtenir la combinaison.

+0

Désolé, je ne comprends pas. Pouvez-vous ajouter une sortie avec vos données d'entrée? – jezrael

+0

J'ai mis à jour le message initial avec des données révisées. – Lorant

Répondre

0

utilisation, set_index, T et stack:

df.set_index(['Load','Voltage','Device','temperature']).T.stack([0,1]) 

Sortie:

Device      A   B  
temperature     0 40 0 40 
      Load Voltage      
Measurement1 1 5  0.1 0.2 0.3 0.4 
      2 5  0.5 0.6 0.7 0.8 
Measurement2 1 5  0.9 1.0 1.1 1.2 
      2 5  1.3 1.4 1.5 1.6 

Et, vous ne voulez pas les noms d'index de colonne ajouter rename_axis:

(df.set_index(['Load','Voltage','Device','temperature']).T.stack([0,1]) 
     .rename_axis([None,None],1)) 

Sortie:

       A   B  
          0 40 0 40 
      Load Voltage      
Measurement1 1 5  0.1 0.2 0.3 0.4 
      2 5  0.5 0.6 0.7 0.8 
Measurement2 1 5  0.9 1.0 1.1 1.2 
      2 5  1.3 1.4 1.5 1.6