python - 在 Pandas 中是否有一种 pythonic 的方法来做一个列联表?

标签 python python-2.7 pandas dataframe

给定一个如下所示的数据框:

            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/

相关文章:

python - 使用字典绘制条形图并使用另一个字典为每个条形指定指定的颜色

python - xlwings 函数查找最后一行数据

python - 使用 turtle.onclick() 改变一个变量

python /基维 : How to put dynamic label widget and value

python - 计算自引用日期起 n 天的平均值

python - pandas cumsun - 达到最大值后重置或 ID 更改时重置

python - 正则表达式如何仅删除包含某些特定字母的单词

python - 如何使用 BeautifulSoup 修复 Python 中的 'Connection aborted.' 错误

python - 根据列值而不是索引值从 Pandas 数据框中排除行

python - 替换 Pandas 多列中的一系列整数值