web-dev-qa-db-ja.com

パンダにコンティンジェンシーテーブルを作成するPython的な方法はありますか?

次のようなデータフレームがあるとします。

            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

ありがとう

23
hernanavella

データフレームをdataと呼びましょう。試して

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

おそらく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)
29

pandasクロス集計関数に関する非常に便利なページを次に示します。

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

だから私はあなたがやりたいことのためにあなたが使うべきだと思う

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

お役に立てば幸いです!

7
Joseph Whiting
_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に行く必要があります。

4
Dyno Fu