Tengo una lista de tuplas como
data = [
('r1', 'c1', avg11, stdev11),
('r1', 'c2', avg12, stdev12),
('r2', 'c1', avg21, stdev21),
('r2', 'c2', avg22, stdev22)
]
y me gustaría ponerlos en un DataFrame de pandas con filas nombradas por la primera columna y columnas nombradas por la segunda columna. Parece que la forma de cuidar los nombres de las filas es algo así, pandas.DataFrame([x[1:] for x in data], index = [x[0] for x in data])
pero ¿cómo cuido las columnas para obtener una matriz de 2x2 (la salida del conjunto anterior es 3x4)? ¿Existe una forma más inteligente de cuidar las etiquetas de fila también, en lugar de omitirlas explícitamente?
EDITAR Parece que necesitaré 2 DataFrames, uno para promedios y otro para desviaciones estándar, ¿es correcto? ¿O puedo almacenar una lista de valores en cada "celda"?
python
python-2.7
pandas
pivot
gt6989b
fuente
fuente
Respuestas:
Puede girar su DataFrame después de crear:
>>> 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
fuente
0
y la columna con el nombre1
no son muy bonitas ...Sugiero que es mejor dejar sus datos apilados como están:
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'])
Entonces es un poco más intuitivo decir
df.set_index(['R_Number', 'C_Number']).Avg.unstack(level=1)
De esta manera, está implícito que está buscando remodelar los promedios o las desviaciones estándar. Mientras que, solo usar
pivot
, se basa puramente en la convención de columna en cuanto a qué entidad semántica es la que está remodelando.fuente
[R_Number, C_Number]
, puede hacerlodf.ix[('r1','c2')]
, por ejemplo. O puede dejar los tanto como columnas regulares y utilizar la indexación lógica:df[(df.R_Number == 'r1') & (df.C_Number == 'c2')]
pivot
es cuando está formateando una tabla para que se imprima bien en la pantalla, o se exporte bien a HTML, LaTeX o .csv, o algo así. Como formatear una tabla que se incluirá en una presentación o envío de un artículo. De lo contrario, en lo que respecta a manipular datos de manera eficiente, desea que las cosas sean índices múltiples cuando pueda (como claves para una tabla de base de datos) o al menos como columnas repetidas para que pueda indexar y unir de manera eficiente, etc. Pero no lo hace quieren hacerlos estallar en sus propias columnas.Esto es lo que esperaba ver cuando llegué a esta pregunta:
#!/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)
da
a b c d India 1 2 3 4 France 5 6 7 8 England 9 0 1 2 Germany 3 4 5 6
fuente