web-dev-qa-db-fra.com

Construire pandas DataFrame à partir de la liste des n-uplets de (row, col, values)

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"?

71
gt6989b

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
63
Roman Pekar

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.

45
ely

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
30
Martin Thoma