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 gérer les noms de ligne ressemble à pandas.DataFrame([x[1:] for x in data], index = [x[0] for x in data])
mais comment puis-je gérer les colonnes pour obtenir une matrice 2x2 (la sortie du jeu précédent est 3x4)? Existe-t-il un moyen plus intelligent de s’occuper des étiquettes de rangées au lieu de les omettre explicitement?
EDIT Il semble que j'aurai 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 avoir créé:
>>> 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 de dire
df.set_index(['R_Number', 'C_Number']).Avg.unstack(level=1)
De cette façon, il est implicite que vous cherchiez à remodeler les moyennes ou les écarts-types. Tandis que, juste en utilisant pivot
, c'est purement basé sur la convention de colonne quant à quelle entité sémantique vous êtes en train de remodeler.
Voici ce à quoi je m'attendais lorsque 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
a b c d
India 1 2 3 4
France 5 6 7 8
England 9 0 1 2
Germany 3 4 5 6