Ответ 1
Назовем ваш dataframe data
. Попробуйте
a = data['A']>0
b = data['B']>0
data.groupby([a,b]).count()
С учетом кадра данных, который выглядит так:
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
Спасибо
Назовем ваш dataframe data
. Попробуйте
a = data['A']>0
b = data['B']>0
data.groupby([a,b]).count()
Вероятно, проще всего использовать функцию 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)
Здесь действительно полезная страница о функции кросс-таблицы pandas:
http://chrisalbon.com/python/pandas_crosstabs.html
Итак, я думаю, что вы хотите использовать
import pandas as pd
pd.crosstab(data['A']>0, data['B']>0)
Надеюсь, что это поможет!
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.