2015-04-27 14 views
14

einen Datenrahmen gegeben, der wie folgt aussieht:Gibt es einen pythischen Weg, um eine Kontingenztabelle in Pandas zu machen?

  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 

Gibt es einen pythonic Weg, um eine 2x2-Matrix wie folgt zu erstellen:

1 0 
1 a b 
0 c d 

Wo:

a = Anzahl der obs wo die entsprechende Elemente der Spalten A und B sind beide positiv.

b = Anzahl der obs, wo die entsprechenden Elemente der Spalte A positiv und negativ sind in Spalte B.

c = Anzahl der obs, wo die entsprechenden Elemente der Spalte A negativ und positiv sind in Spalte B.

d = Anzahl der Obs, wobei die entsprechenden Elemente der Spalten A und B beide negativ sind.

Für dieses Beispiel würde der Ausgang sein:

1 0 
1 2 3 
0 3 1 

Dank

Antwort

12

uns data Ihre Datenrahmen Lassen Sie anrufen. Versuchen

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

Wer auch immer diese Antwort abgelehnt: Bitte hinterlassen Sie einen Kommentar - warum. – 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() 

Ausgang:

B  False True 
A 
False  1  3 
True  3  2 

dies nur Antwort der lnanenok und mit unstack(), um es besser lesbar. Kredit sollte nach Lanenok gehen.

17

Wahrscheinlich am einfachsten, nur die Pandas-Funktion crosstab zu verwenden. Angelehnt an Dyno Fu oben:

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) 

Ausgang:

B  False True 
A     
False  1  3 
True  3  2 

[2 rows x 2 columns] 

Auch der Tisch verwendbar ist, wenn Sie einen Fisher-Exact-Test mit scipy.stats etc zu tun:

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

Kannst du zeigen, wie du Fisher damit fütterst? – vy32

+1

Sicher, ich habe eine kurze Bearbeitung über –

+0

hinzugefügt Danke! Ich weiß deine Bemühungen zu schätzen. – vy32

4

Hier ist eine wirklich nützliche Seite über die Pandas Kreuztabellenfunktion:

http://chrisalbon.com/python/pandas_crosstabs.html

Ich denke also, für das, was Sie Sie

import pandas as pd 
pd.crosstab(data['A']>0, data['B']>0) 

Hoffnung verwenden sollten, tun würde, das hilft!

Verwandte Themen