给定一个如下所示的数据框:
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 矩阵的 Pythonic 方法:
1 0
1 a b
0 c d
地点:
a = A 列和 B 列的对应元素均为正数的 obs 数。
b = B 列中 A 列对应元素为正数和负数的 obs 数。
c = obs 的数量,其中 A 列的相应元素在 B 列中为负数和正数。
d = A 列和 B 列对应元素均为负数的 obs 数。
对于本例,输出将是:
1 0
1 2 3
0 3 1
谢谢
最佳答案
使用 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]
如果您想使用 scipy.stats
等进行 Fisher 精确测试,该表也可用:
from scipy.stats import fisher_exact
tab = pd.crosstab(df.A > 0, df.B > 0)
fisher_exact(tab)
关于python - 在 Pandas 中是否有一种 pythonic 的方法来做一个列联表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29901436/