2012-08-15 38 views
6

Tengo problemas con los índices jerárquicos en el paquete Python pandas. Específicamente, no entiendo cómo filtrar y comparar datos en filas después de que se haya pivotado.Filtrado y selección de tablas dinámicas hechas con pandas de pitón

Aquí está la tabla de ejemplo de la documentación:

import pandas as pd 
import numpy as np 

In [1027]: df = pd.DataFrame({'A' : ['one', 'one', 'two', 'three'] * 6, 
          'B' : ['A', 'B', 'C'] * 8, 
          'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 4, 
          'D' : np.random.randn(24), 
          'E' : np.random.randn(24)}) 

In [1029]: pd.pivot_table(df, values='D', rows=['A', 'B'], cols=['C']) 
Out[1029]: 
    C    bar  foo 
    A  B      
    one A -1.154627 -0.243234 
      B -1.320253 -0.633158 
      C 1.188862 0.377300 
    three A -1.327977  NaN 
      B  NaN -0.079051 
      C -0.832506  NaN 
    two A  NaN -0.128534 
      B 0.835120  NaN 
      C  NaN 0.838040 

me gustaría analizar de la siguiente manera:

1) Filtrar esta tabla en la columna de atributos, por ejemplo, la selección de filas con 'foo' negativo :

C    bar  foo 
    A  B      
    one A -1.154627 -0.243234 
      B -1.320253 -0.633158 
    three B  NaN -0.079051 
    two A  NaN -0.128534 

2) comparar los valores de la serie B que queda entre el distinto A grupos de series? No estoy seguro de cómo acceder a esta información: {'uno': ['A', 'B'], 'dos': ['A'], 'tres': ['B']} y determinar qué serie Los valores B son únicos para cada clave, o se ven en múltiples grupos de claves, etc.

¿Hay alguna manera de hacerlo directamente dentro de la estructura de la tabla dinámica, o necesito convertir esto de nuevo en un marco de datos panda?

Gracias

edición: Creo que este código es un paso en la dirección correcta. Por lo menos me permite acceder a los valores individuales dentro de esta tabla, pero todavía estoy codificación dura de los valles de la serie:

table = pivot_table(df, values='D', rows=['A', 'B'], cols=['C']) 
table.ix['one', 'A'] 

Respuesta

9

Tabla pivote devuelve una trama de datos por lo que simplemente puede filtrar por hacer:

In [15]: pivoted = pivot_table(df, values='D', rows=['A', 'B'], cols=['C']) 

In [16]: pivoted[pivoted.foo < 0] 
Out[16]: 
C    bar  foo 
A  B      
one A -0.412628 -1.062175 
three B  NaN -0.562207 
two A  NaN -0.007245 

Se puede usar algo como

pivoted.ix['one'] 

para seleccionar todos los grupos de series a

o

pivoted.ix['one', 'A'] 

para seleccionar grupos distintos de la serie A y B

+0

Gracias por sus comentarios. ¿Hay alguna manera de obtener una lista de valores en una columna de tabla dinámica especificando el encabezado? Puedo hacer esto en el dataframe con 'df [' A ']. Values' pero estoy luchando por obtener algo similar de la tabla dinámica – alexhli

+0

el resultado de la tabla dinámica es un DataFrame. Entonces, simplemente puede hacer 'pivoted.bar.values' –

+2

lo que me confunde es que cuando intento' pivoted.dtypes' veo información en la columna C, pero quiero ver las columnas A y B. Esperaba que hubiera una manera fácil de obtener el conjunto de valores B por cada valor A como '{'uno': ['A', 'B'], 'dos': ['A'], 'tres': ['B']} 'pero no veo nada de eso en la documentación de los pandas – alexhli

Cuestiones relacionadas