pandas - Fisher's Exact in scipy 作为使用 pandas 的新专栏

标签 pandas scipy ipython-notebook

使用 ipython 笔记本,pandas 数据框有 4 列:numerator1numerator2denominator1denominator2

在不遍历每条记录的情况下,我试图创建名为 FishersExact 的第五列。我希望列的值存储 scipy.stats.fisher_exact 返回的元组使用四列中每一列的值(或值的某些派生)作为我的输入。

df['FishersExact'] = scipy.stats.fisher_exact( [[df.numerator1, df.numerator2],
[df.denominator1 - df.numerator1 , df.denominator2 - df.numerator2]])

返回:

/home/kevin/anaconda/lib/python2.7/site-packages/scipy/stats/stats.pyc in fisher_exact(table, alternative)
2544     c = np.asarray(table, dtype=np.int64)  # int32 is not enough for the algorithm
2545     if not c.shape == (2, 2):
-> 2546         raise ValueError("The input `table` must be of shape (2, 2).")
2547 
2548     if np.any(c < 0):

ValueError: The input `table` must be of shape (2, 2).

当我只索引数据框的第一条记录时:

odds,pval = scipy.stats.fisher_exact([[df.numerator1[0], df.numerator2[0]], 
[df.denominator1[0] - df.numerator1[0], df.denominator2[0] -df.numerator2[0]]])

这是返回:

1.1825710754 0.581151431104

我本质上是在尝试模拟类似于以下的算术功能:

df['freqnum1denom1'] = df.numerator1 / df.denominator1

它返回添加到数据框的新列,其中每个记录的频率都在新列中。

可能遗漏了一些东西,任何方向将不胜感激,谢谢!

最佳答案

看起来您正在构建一个 pandas 系列矩阵,并将其传递给函数。该函数需要一个标量矩阵;你可以多次调用它。这两件事并不完全相同。

(至少)有两种方法可以到达这里。

使用应用

你可以使用 pandasapply为此。

df['FishersExact'] = df.apply(
    lambda r: scipy.stats.fisher_exact([[r.numerator1, ... ]]),
    axis=1)

注意以下几点:

  • axis=1 对每一行应用一个函数。

  • lambda 中,r.numerator 是一个标量。

回归基础

Fischer's exact test可以描述为原始列中的向量化操作,应该会快很多。要最大程度地提高速度,您需要使用阶乘的矢量化版本(我不知道)。这甚至可以是一个单独的(很好!)SO 问题。

关于pandas - Fisher's Exact in scipy 作为使用 pandas 的新专栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30309416/

相关文章:

用于数据框中多个索引的 Python pandas idxmax

python - 如何替换出现 "Value Error"的值?

python - scipy curve_fit 无法拟合顶帽函数

python - Scipy 按元素最小化目标

pandas - 如何在同一个 ipython 笔记本单元格中绘制两个 Pandas 系列自动使用不同的颜色?

python - Tensorflow/Keras Conv2D 层中的输入形状错误

python - 将 pandas 中的索引更改为日期/时间类型?

python - scipy.optimize.fim错误: need more than 1 value to unpack

python - 禁止 NBConvert 中的代码? IPython

ipython notebook nbconvert - 如何删除单元格输出左上角的红色 'out[N]' 文本?