2012-08-15 7 views
6

Mam problemy z hierarchicznymi indeksami w pakiecie Python pandas. W szczególności nie rozumiem, jak filtrować i porównywać dane w wierszach po obróceniu.Filtrowanie i wybieranie z tabel przestawnych wykonanych z pandonów Pythona

Oto przykład tabela z dokumentacją:

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 

chciałbym analizować następująco:

1) Filtr tej tabeli w kolumnie atrybutów, na przykład wybierając wiersze z ujemnym „foo” :

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) Porównaj pozostałe wartości serii B między odrębnymi grupami serii A? Nie wiem, jak uzyskać dostęp do tych informacji: {'jeden': ["A", "B"], "dwa": ["A"], "trzy": ["B"]} i określić, która seria Wartości B są unikalne dla każdego klucza lub widoczne w wielu grupach kluczy, itp.

Czy istnieje sposób, aby zrobić to bezpośrednio w strukturze tabeli przestawnej, czy też trzeba go przekonwertować z powrotem na ramkę danych panda?

Dziękuję

edit: myślę, że ten kod jest krokiem w dobrym kierunku. To przynajmniej pozwala mi dostęp do poszczególnych wartości w tej tabeli, ale nadal jestem twardy kodowania dolin serii:

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

Odpowiedz

9

Pivot table zwraca DataFrame tak po prostu można filtrować według robi:

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 

można użyć czegoś podobnego

pivoted.ix['one'] 

aby zaznaczyć wszystkie grupy A serii

lub

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

wybrać odrębnych grup serii A i B

+0

Dziękujemy za opinię. Czy istnieje sposób, aby uzyskać listę wartości w kolumnie tabeli przestawnej, określając nagłówek? Mogę to zrobić na ramce danych z wartościami "df ['A']." Ale staram się uzyskać coś podobnego z tabeli przestawnej – alexhli

+0

wynikiem tabeli przestawnej jest DataFrame. Więc możesz po prostu zrobić 'pivoted.bar.values' –

+2

, co jest mylące, jest to, że kiedy próbuję' pivoted.dtypes' widzę informacje na kolumnie C, ale chcę spojrzeć na kolumny A i B. Miałem nadzieję, że istnieje prosty sposób na uzyskanie zestawu wartości B na każdą wartość A, taką jak "{" jeden ": [" A "," B "]," dwa ": [" A "]," trzy ": ['B']} 'ale nie widzę czegoś takiego w dokumentacji pandy – alexhli

Powiązane problemy