recorrer - sumar columnas dataframe python
Construir pandas DataFrame a partir de una lista de tuplas de(fila, col, valores) (3)
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 2da columna. Parece que la forma de cuidar los nombres de las filas es algo como pandas.DataFrame([x[1:] for x in data], index = [x[0] for x in data])
pero ¿cómo me ocupo de las columnas para obtener una matriz de 2x2 (la salida del conjunto anterior es 3x4)? ¿Existe una forma más inteligente de cuidar también las etiquetas de fila, en lugar de omitirlas explícitamente?
EDITAR Parece que necesitaré 2 DataFrames, uno para los promedios y otro para las desviaciones estándar, ¿es correcto? ¿O puedo almacenar una lista de valores en cada "celda"?
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
Presento que es mejor dejar sus datos apilados tal 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 decirlo
df.set_index([''R_Number'', ''C_Number'']).Avg.unstack(level=1)
De esta forma, está implícito que está tratando de remodelar los promedios o las desviaciones estándar. Mientras que, usando solo el pivot
, está basado puramente en la convención de columnas en cuanto a qué entidad semántica es la que está remodelando.
Puede pivotar 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