如何将pandas列中的值以矢量化的方式传递到scipy.stats.binomtest中,并将答案存储在新的列中?

nfeuvbwi  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(111)

我有 Dataframe births
| | 年份|性别|出生人数|出生总数|
| - -|- -|- -|- -|- -|
| 一个|小行星1880|米|小行星110491|小行星2014|
| 三个|小行星1881|米|小行星100743|小行星192696|
| 五个|小行星1882|米|小行星113686|小行星221533|
| 七个|小行星1883|米|小行星104627|小行星216946|
| 九个|小行星1884|米|小行星114442|小行星243462|
| 十一|小行星1885|米|小行星107799|小行星240854|
| 十三个|小行星1886|米|小行星110784|小行星255|
| 十五个|小行星1887|米|小行星101413|小行星247394|
| 十七岁|小行星1888|米|小行星120851|小行星2994|
| 十九个|小行星1889|米|小行星110580|小行星288946|
我想使用scipy中的binomtest进行测试,并将p值添加到一个新列:

(births
 .assign(binom_pvalue=lambda x: stats.binomtest(x.num_births, x.total_births).pvalue)
)

但我得到的错误是TypeError: k must be an integer.
看起来我传递的是整个序列,而不是每行的值。但是,此方法在执行以下操作时有效:

(num_births
 .assign(ratio=lambda x: x.num_births / x.total_births)
)

输出:
| | 年份|性别|出生人数|出生总数|比值|
| - -|- -|- -|- -|- -|- -|
| 一个|小行星1880|米|小行星110491|小行星2014| 0.548386单位|
| 三个|小行星1881|米|小行星100743|小行星192696| 0.522808单位|
| 五个|小行星1882|米|小行星113686|小行星221533| 0.513179美元|
| 七个|小行星1883|米|小行星104627|小行星216946| 0.482272个单位|
| 九个|小行星1884|米|小行星114442|小行星243462| 0.470061单位|
在此方案中,它以矢量化方式使用每行的值。
我如何使用binomtest函数,使用我在上面尝试的相同风格?
感谢您的回答!
威廉

kgqe7b3p

kgqe7b3p1#

您可以使用lambdaassign来尝试执行此操作:

import pandas as pd
from scipy.stats import binomtest

births = pd.DataFrame(
    data={
        "year": [1880, 1881],
        "sex": ["M", "M"],
        "num_births": [110491, 100743],
        "total_births": [201484, 192696],
    }
)

births.assign(
    p_value=lambda pvalue: [
        binomtest(i, j).pvalue for i, j in zip(births.num_births, births.total_births)
    ]
)

以下是输出:

year sex  num_births  total_births       p_value
0  1880   M      110491        201484  0.000000e+00
1  1881   M      100743        192696  3.317445e-89

相关问题