2015-04-27 8 views
14

Biorąc pod uwagę dataframe, który wygląda tak:Czy istnieje pythonic sposób zrobienia tabeli kontyngencji w Pandas?

  A B  
2005-09-06 5 -2 
2005-09-07 -1 3 
2005-09-08 4 5 
2005-09-09 -8 2 
2005-09-10 -2 -5 
2005-09-11 -7 9 
2005-09-12 2 8 
2005-09-13 6 -5 
2005-09-14 6 -5 

Czy istnieje pythonic sposób utworzyć macierz 2x2 takiego:

1 0 
1 a b 
0 c d 

Gdzie:

a = liczba obs gdzie na odpowiadające elementy kolumny A i B są dodatnie.

b = liczba OB, gdzie odpowiednie elementy z kolumny A są dodatnie i ujemne w kolumnie B

c = liczba OB, gdzie odpowiednie elementy z kolumny A są ujemne i dodatnie w kolumnie B

d = liczba obs obsługiwania, gdy odpowiadające elementy kolumny A i B są ujemne.

W tym przykładzie wyjście byłoby:

1 0 
1 2 3 
0 3 1 

Dzięki

Odpowiedz

12

Nazwijmy Twój dataframe data. Spróbuj

a = data['A']>0 
b = data['B']>0 
data.groupby([a,b]).count() 
+1

Ktokolwiek uwzględnił tę odpowiedź: zostaw komentarz - dlaczego. – lanenok

3
import pandas as pd 
from StringIO import StringIO 

table = """dt   A B 
2005-09-06 5 -2 
2005-09-07 -1 3 
2005-09-08 4 5 
2005-09-09 -8 2 
2005-09-10 -2 -5 
2005-09-11 -7 9 
2005-09-12 2 8 
2005-09-13 6 -5 
2005-09-14 6 -5 
""" 
sio = StringIO(table) 
df = pd.read_table(sio, sep=r"\s+", parse_dates=['dt']) 
df.set_index("dt", inplace=True) 

a = df['A'] > 0 
b = df['B'] > 0 
df1 = df.groupby([a,b]).count() 
print df1["A"].unstack() 

wyjście:

B  False True 
A 
False  1  3 
True  3  2 

to właśnie lnanenok na odpowiedź i za pomocą unstack() aby uczynić go bardziej czytelnym. kredyt powinien iść do lanenok.

17

Prawdopodobnie najłatwiej po prostu użyć funkcji pandy crosstab. Pożyczanie od Dyno Fu powyżej:

import pandas as pd 
from StringIO import StringIO 
table = """dt   A B 
2005-09-06 5 -2 
2005-09-07 -1 3 
2005-09-08 4 5 
2005-09-09 -8 2 
2005-09-10 -2 -5 
2005-09-11 -7 9 
2005-09-12 2 8 
2005-09-13 6 -5 
2005-09-14 6 -5 
""" 
sio = StringIO(table) 
df = pd.read_table(sio, sep=r"\s+", parse_dates=['dt']) 
df.set_index("dt", inplace=True) 

pd.crosstab(df.A > 0, df.B > 0) 

wyjściowa:

B  False True 
A     
False  1  3 
True  3  2 

[2 rows x 2 columns] 

także tabela jest użyteczny, jeśli chcesz zrobić Fisher dokładnego testu z scipy.stats etc:

from scipy.stats import fisher_exact 
tab = pd.crosstab(df.A > 0, df.B > 0) 
fisher_exact(tab) 
+0

Czy możesz pokazać, jak karmisz to Fisherowi? – vy32

+1

Pewnie, dodałem krótką edycję powyżej –

+0

Dzięki! Doceniam twoje wysiłki. – vy32

Powiązane problemy