Construire des pandas DataFrame à partir de la liste des tuples de (ligne, col, valeurs)

J’ai une liste de tuples comme

data = [ ('r1', 'c1', avg11, stdev11), ('r1', 'c2', avg12, stdev12), ('r2', 'c1', avg21, stdev21), ('r2', 'c2', avg22, stdev22) ] 

et je voudrais les mettre dans un pandas DataFrame avec des lignes nommées par la première colonne et des colonnes nommées par la 2ème colonne. Il semble que la manière de prendre en charge les noms de lignes est quelque chose comme pandas.DataFrame([x[1:] for x in data], index = [x[0] for x in data]) les colonnes pour obtenir une masortingce 2×2 (la sortie de l’ensemble précédent est 3×4)? Existe-t-il une manière plus intelligente de prendre en compte les étiquettes de lignes, au lieu de les omettre explicitement?

EDIT Il semble que je vais avoir besoin de 2 DataFrames – un pour les moyennes et un pour les écarts-types, est-ce correct? Ou puis-je stocker une liste de valeurs dans chaque “cellule”?

Vous pouvez faire pivoter votre DataFrame après la création:

 >>> df = pd.DataFrame(data) >>> df.pivot(index=0, columns=1, values=2) # avg DataFrame 1 c1 c2 0 r1 avg11 avg12 r2 avg21 avg22 >>> df.pivot(index=0, columns=1, values=3) # stdev DataFrame 1 c1 c2 0 r1 stdev11 stdev12 r2 stdev21 stdev22 

Je soumets qu’il est préférable de laisser vos données empilées telles quelles:

 df = pandas.DataFrame(data, columns=['R_Number', 'C_Number', 'Avg', 'Std']) # Possibly also this if these can always be the indexes: # df = df.set_index(['R_Number', 'C_Number']) 

Alors c’est un peu plus intuitif à dire

 df.set_index(['R_Number', 'C_Number']).Avg.unstack(level=1) 

De cette façon, il est implicite que vous cherchez à remodeler les moyennes ou les écarts types. Alors que, juste en utilisant pivot , il est purement basé sur la convention de colonne quant à quelle entité sémantique c’est que vous êtes en train de remodeler.

C’est ce que je m’attendais à voir quand je suis arrivé à cette question:

 #!/usr/bin/env python import pandas as pd df = pd.DataFrame([(1, 2, 3, 4), (5, 6, 7, 8), (9, 0, 1, 2), (3, 4, 5, 6)], columns=list('abcd'), index=['India', 'France', 'England', 'Germany']) print(df) 

donne

  abcd India 1 2 3 4 France 5 6 7 8 England 9 0 1 2 Germany 3 4 5 6