Подтвердить что ты не робот

Есть ли способ pythonic сделать таблицу непредвиденных обстоятельств в 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  

Существует ли pythonic способ создания матрицы 2x2 следующим образом:

    1  0
 1  a  b
 0  c  d

Где:

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

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

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

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

В этом примере вывод будет:

    1  0
 1  2  3
 0  3  1

Спасибо

4b9b3361

Ответ 1

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

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

Ответ 2

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

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]

Также таблица может использоваться, если вы хотите выполнить точный тест Fisher с помощью scipy.stats и т.д.:

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

Ответ 3

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

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

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

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

Надеюсь, что это поможет!

Ответ 4

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(), чтобы сделать его более читаемым. кредит должен идти в lanenok.