2013-06-08 11 views
7

Robię kilka crosstabs z pand:Brakujące dane w pandas.crosstab

a = np.array(['foo', 'foo', 'foo', 'bar', 'bar', 'foo', 'foo'], dtype=object) 
b = np.array(['one', 'one', 'two', 'one', 'two', 'two', 'two'], dtype=object) 
c = np.array(['dull', 'dull', 'dull', 'dull', 'dull', 'shiny', 'shiny'], dtype=object) 

pd.crosstab(a, [b, c], rownames=['a'], colnames=['b', 'c']) 

b  one two  
c dull dull shiny 
a      
bar  1  1  0 
foo  2  1  2 

Ale co faktycznie chcę jest następująca:

b  one  two  
c dull shiny dull shiny 
a      
bar  1  0 1  0 
foo  2  0 1  2 

znalazłem obejście dodając nową kolumnę i ustawić poziomów jako nowy MultiIndex, ale wydaje się trudne ...

Czy istnieje sposób przekazać MultiIndex do tabeli krzyżowej, aby wstępnie zdefiniować kolumny wyjściowe?

+0

"Wydaje się być trudnym" to takie wspaniałe niedopowiedzenie :) –

Odpowiedz

4

Nie sądzę, że jest jakiś sposób, aby to zrobić, i crosstab dzwoni pivot_table w źródle, co też nie oferuje tego. Podniosłem to jako numer here.

hacky obejście (które mogą lub nie mogą być takie same, jak już przy użyciu ...):

from itertools import product 
ct = pd.crosstab(a, [b, c], rownames=['a'], colnames=['b', 'c']) 
a_x_b = list(product(np.unique(b), np.unique(c))) 
a_x_b = pd.MultiIndex.from_tuples(a_x_b) 

In [15]: ct.reindex_axis(a_x_b, axis=1).fillna(0) 
Out[15]: 
     one   two 
    dull shiny dull shiny 
a 
bar  1  0  1  0 
foo  2  0  1  2 

Jeśli product jest zbyt powolny, tutaj jest a numpy implementation niego.

+0

Blog Wesa o tabeli przestawnej: http://wesmckinney.com/blog/?p=457 –

+0

Zawarłem ten przykład w [wydaniu 3439] (https: //github.com/pydata/pandas/issues/3439), ponieważ moim zdaniem jeden problem polega na tym, że dokumentacja opisuje coś nieprawidłowego. – bmu

+0

Zrobiłem w większości to samo. Myślę, że moje pytanie dotyczy podejścia stosowanego w pandach. Funkcja Crosstab działa zgodnie z oczekiwaniami. Następne pytanie brzmi: Jak mogę pogrupować dane według MultiIndex? Mam na myśli przechodzenie do groupby nie tylko kluczy, ale kluczy i wartości. – norecces

4

Funkcja tabeli krzyżowej ma parametr o nazwie dropna, który jest domyślnie ustawiony na True. Ten parametr określa, czy puste kolumny (takie jak jedna błyszcząca kolumna) powinny być wyświetlane, czy nie.

Próbowałem wywołaniem función takiego:

pd.crosstab(a, [b, c], rownames=['a'], colnames=['b', 'c'], dropna = False) 

i to, co mam:

b  one   two  
c dull shiny dull shiny 
a        
bar  1  0  1  0 
foo  2  0  1  2 

nadzieja, że ​​jeszcze za pomocną.

Powiązane problemy