2012-08-09 16 views
7

Estoy tratando de ajustar mi cerebro alrededor de las estructuras de datos pandas y tratar de usarlas con ira un poco. He descubierto que las operaciones groupby dan como resultado un objeto de la serie pandas. Pero no puedo entender cómo usar la serie resultante. En particular, quiero hacer dos cosas:Unirme a una serie de Pandas con un índice jerárquico de vuelta a la fuente DataFrame

1) "unen" los resultados de vuelta a la trama de datos inicial

2) seleccione un valor específico de la serie resultante basado en el índice jerárquico.

Aquí está un ejemplo de juguete para trabajar con:

import pandas 
df = pandas.DataFrame({'group1': ['a','a','a','b','b','b'], 
         'group2': ['c','c','d','d','d','e'], 
         'value1': [1.1,2,3,4,5,6], 
         'value2': [7.1,8,9,10,11,12] 
}) 
dfGrouped = df.groupby(["group1", "group2"] , sort=True) 

## toy function, obviously not my real function 
def fun(x): return mean(x**2) 

results = dfGrouped.apply(lambda x: fun(x.value1)) 

por lo que las resultantes de la serie (resultados) tiene este aspecto:

group1 group2 
a  c   2.605 
     d   9.000 
b  d   20.500 
     e   36.000 

Eso tiene sentido. Pero, ¿cómo hacer que:

1) se unen a esta vuelta a la trama de datos originales df

2) Seleccionar un valor único, donde, por ejemplo, grupo1 == 'B' & grupo2 == 'd'

Respuesta

8

Así que para seguir siendo # 1.

In [9]: df 
Out[9]: 
    group1 group2 value1 value2 
0  a  c  1.1  7.1 
1  a  c  2.0  8.0 
2  a  d  3.0  9.0 
3  b  d  4.0 10.0 
4  b  d  5.0 11.0 
5  b  e  6.0 12.0 

In [10]: results 
Out[10]: 
group1 group2 
a  c   2.605 
     d   9.000 
b  d   20.500 
     e   36.000 

In [11]: df.set_index(['group1', 'group2'], inplace=True)['results'] = results 

In [12]: df 
Out[12]: 
       value1 value2 results 
group1 group2 
a  c   1.1  7.1 2.605 
     c   2.0  8.0 2.605 
     d   3.0  9.0 9.000 
b  d   4.0 10.0 20.500 
     d   5.0 11.0 20.500 
     e   6.0 12.0 36.000 

In [13]: df.reset_index() 
Out[13]: 
    group1 group2 value1 value2 results 
0  a  c  1.1  7.1 2.605 
1  a  c  2.0  8.0 2.605 
2  a  d  3.0  9.0 9.000 
3  b  d  4.0 10.0 20.500 
4  b  d  5.0 11.0 20.500 
5  b  e  6.0 12.0 36.000 
+1

Parece exactamente lo que estaba tratando de hacer. Ese es un buen ejemplo de cómo establecer el índice. No me di cuenta cómo funciona eso. –

+0

@ wouter-overmeire - muy agradable. Estuve luchando con esto hoy. – John

+0

@ wouter-overmeire, @ jd-long - ¿Cómo funcionaría esto si se tuviera que agregar más de un resultado al DataFrame? Por ejemplo, ¿cómo podrían los resultados de dos funciones separadas, p. 'def UCL (x): return mean (x2) + np.std * 2' y' def LCL (x): return mean (x2) -np.std * 2' se pasa a df? ¿O hay un mejor camino? – John

3

mientras monerías descubrí la respuesta a # 2:

results["b","d"] me da el valor en el grupo 1 == 'b' & grupo2 == 'd'

Cuestiones relacionadas