2015-04-27 3 views
14

Учитывая dataframe, который выглядит следующим образом:Есть ли в 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 

Есть ли вещий способ создать матрицу 2х2, как это:

1 0 
1 a b 
0 c d 

Где:

а = число набл где соответствующие элементы столбцов A и B являются положительными.

б = число набли, где соответствующие элементы столбца А являются положительными и отрицательными в столбце B.

с = количество набли, где соответствующие элементы столбца А являются отрицательными и положительными в столбце B.

d = номер общности, где соответствующие элементы столбцов A и B оба отрицательные.

В этом примере результат будет:

1 0 
1 2 3 
0 3 1 

Благодаря

ответ

12

Обратим ваше dataframe data. Попробуйте

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

Кто бы ни отклонил этот ответ: пожалуйста, оставьте комментарий - почему. – 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() 

выход: ответ

B  False True 
A 
False  1  3 
True  3  2 

это просто lnanenok и используя unstack(), чтобы сделать его более удобным для чтения. кредит должен идти на ланенок.

17

Наверное, проще всего использовать функцию панд crosstab. Заимствуя Dyno Фу выше:

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) 

Выход:

B  False True 
A     
False  1  3 
True  3  2 

[2 rows x 2 columns] 

Также таблица использовать, если вы хотите сделать точный тест Фишера с scipy.stats и т.д.:

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

Можете ли вы показать, как вы кормите это в Фишера? – vy32

+1

Sure, Я добавил короткое изменение выше –

+0

Спасибо! Я ценю ваши усилия. – vy32

4

Вот действительно полезная страница о функции кросс-таблицы pandas:

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

Так что я думаю, что вы хотели бы сделать, вы должны использовать

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

Надежда, что помогает!

Смежные вопросы