次のようなデータフレームがあるとします。
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
次のような2x2行列を作成するPythonの方法はありますか?
1 0
1 a b
0 c d
どこ:
a =列AとBの対応する要素が両方とも正であるobsの数。
b =列Aの対応する要素が列Bで正と負の場合のオブスの数。
c =列Aの対応する要素が列Bで正と負のオブスの数。
d =列AとBの対応する要素が両方とも負の場合のオブスの数。
この例では、出力は次のようになります。
1 0
1 2 3
0 3 1
ありがとう
データフレームをdata
と呼びましょう。試して
a = data['A']>0
b = data['B']>0
data.groupby([a,b]).count()
おそらくpandas function 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]
また、scipy.stats
etc:
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に行く必要があります。