Pandas 费希尔';s在scipy中作为使用熊猫的新列精确

Pandas 费希尔';s在scipy中作为使用熊猫的新列精确,pandas,scipy,ipython-notebook,Pandas,Scipy,Ipython Notebook,使用ipython笔记本电脑,熊猫数据框有4列:数值1、数值2、分母1和分母2 在不遍历每条记录的情况下,我尝试创建第五列,标题为FishersExact。我希望列的值存储通过使用四列中的每一列的值(或值的某些派生)作为输入返回的元组 df['FishersExact'] = scipy.stats.fisher_exact( [[df.numerator1, df.numerator2], [df.denominator1 - df.numerator1 , df.denominator2 -

使用ipython笔记本电脑,熊猫数据框有4列:数值1数值2分母1分母2

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

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).
这是返回的:

1.1825710754 0.581151431104
我基本上是在模拟算术功能,类似于:

df['freqnum1denom1'] = df.numerator1 / df.denominator1
它返回添加到数据帧的新列,其中每个记录的频率在新列中


可能遗漏了什么,任何方向都将不胜感激,谢谢

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

这里有(至少)两种方法

使用
应用

您可以使用
pandas

df['FishersExact'] = df.apply(
    lambda r: scipy.stats.fisher_exact([[r.numerator1, ... ]]),
    axis=1)
注意以下几点:

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

  • lambda
    中,
    r.分子
    是一个标量

回归基础


可以在原始列中描述为向量化操作,这应该快得多。要将速度提高到最大,需要使用向量化版本的阶乘(我不知道)。这甚至可能是一个单独的(好!)问题。

感谢您的解释,您的建议已执行,但我的表已超过20万行,执行过程已使我的计算机停止运行。使用.head()对10行进行了测试,并返回了第五列,其中完全符合我的要求。非常感谢。在“更快的执行”上添加了一个简介。我想你需要在某一点上再问一点。请看上面。请看我的答案:stackoverflow.com/questions/34947578/…它在几秒钟内计算出数百万行的答案:)@unfuncat Cool!
df['FishersExact'] = df.apply(
    lambda r: scipy.stats.fisher_exact([[r.numerator1, ... ]]),
    axis=1)