2013-12-12 20 views
5

Czy istnieje funkcja pandy do transformacji tych danych, aby wyświetlały kolumny jako a, b, c, d, e lub cokolwiek w polu danych, a wiersze zliczają ile z nich znajduje się.Transforming Panda DataFrame

import pandas as pd 

trans = pd.read_table('output.txt', header=None, index_col=0) 

print trans 
>>> 
     1 2 3 4 
0      
11  a b c NaN 
666  a d e NaN 
10101 b c d NaN 
1010 a b c d 
414147 b c NaN NaN 
10101 a b d NaN 
1242 d e NaN NaN 
101  a b c d 
411  c d e NaN 
444  a b c NaN 

zamiast Chcę wyjście być tak:

 a b c  d e 
0      
11  1 1 1 NaN NaN 
666  1 NaN NaN 1 1 

Funkcja .stack() prawie dostaje to zrobić, ale w niewłaściwym formacie.

Odpowiedz

5

Można również użyć Pandy get_dummies()

pd.get_dummies(df.unstack().dropna()).groupby(level=1).sum() 

wyniki w:

 a b c d e 
0      
11  1 1 1 0 0 
666  1 0 0 1 1 
10101 0 1 1 1 0 
1010 1 1 1 1 0 
414147 0 1 1 0 0 
10101 1 1 0 1 0 
1242 0 0 0 1 1 
101  1 1 1 1 0 
411  0 0 1 1 1 
444  1 1 1 0 0 

Można wymienić zer z Nan w chcesz do.

Jest nieco niejasny w jednej linii. df.unstack().dropna() zasadniczo spłaszcza twoją ramkę DataFrame do serii i upuszcza al NaN. get_dummies podaje tabelę wszystkich wystąpień liter, ale dla każdego poziomu w unstack DataFrame. Grupowanie i suma następnie łączą indeks z pierwotnym kształtem.

+0

Piękna. Znacznie lepiej niż moja (teraz usunięta) próba zmuszenia get_dummies do pracy na DataFrame. Naprawdę podoba mi się '' unstack(). Dropna() '' idiom. –

+0

Zauważyłem, że mógłbyś to zostawić, nie szkodząc w posiadaniu niektórych opcji. Wciąż zgadzam się z twoim wcześniejszym komentarzem, że jest mniej ładny (i czytelny) niż rozwiązanie "pivot" z Romana. Pojęcie pivota jest również lepiej znane, a następnie ... 'get_dummies'. :) –

2

Coś takiego może być:

>>> st = pd.DataFrame(trans.stack()).reset_index(level=0) 
>>> st.columns = ['i','c'] 
>>> st.pivot_table(rows='i', cols='c', aggfunc=len) 
c  a b c d e 
i       
11  1 1 1 NaN NaN 
101  1 1 1 1 NaN 
411 NaN NaN 1 1 1 
444  1 1 1 NaN NaN 
666  1 NaN NaN 1 1 
1010  1 1 1 1 NaN 
1242 NaN NaN NaN 1 1 
10101 1 2 1 2 NaN 
414147 NaN 1 1 NaN NaN 
+0

zamknij, ale .reset_index (poziom = 0) daje błąd ValueError ("nie można wstawić% s, już istnieje"% element) – user3084006

+1

jakiej wersji pand używasz? –

+0

Używam wersji rozwojowej wersji 0.13 od 04-Dec-2013 – user3084006