如何将两个样本比例测试应用于 pandas 数据框?

How to apply a two sample proportion test to a pandas dataframe?

我正在尝试对 pandas 数据框的每一行应用 z 检验,如下所示:

from statsmodels.stats.proportion import proportions_ztest    

def apply_ztest(n1, n2, x1, x2):
      return proportions_ztest(
        count=[n1 , n2], 
        nobs=[x1, x2], 
        alternative='larger'
      )[1]

df['p_val'] = df.apply(lambda x: apply_ztest(df['n1'], df['n2'], df['obs1'], df['obs2']))

但是我收到了这个错误:

NotImplementedError: more than two samples are not implemented yet

我觉得要么有不同的方法可以做到这一点,要么我把事情搞砸了。谁能告诉我如何 do/fix 这个?

当您应该使用 x['n1'] 时,您使用 df['n1'] 将列传递给您的函数。您还需要指定 axis=1 以应用于行而不是列

我认为您可能将 countn_obs 参数倒推到 proportions_ztest,但我不确定。这是一个小的工作示例

from statsmodels.stats.proportion import proportions_ztest
import pandas as pd
import numpy as np

def apply_ztest(c1, c2, n1, n2):
    return proportions_ztest(
        count=[c1 , c2], 
        nobs=[n1, n2], 
        alternative='larger'
      )[1]

#create fake data
np.random.seed(1)
df = pd.DataFrame({
    'c1':np.random.randint(1,20,10),
    'c2':np.random.randint(1,50,10),
})
df['n1'] = df['c1']+np.random.randint(1,20,10)
df['n2'] = df['c2']+np.random.randint(1,50,10)


df['p_val'] = df.apply(lambda my_row: apply_ztest(my_row['c1'], my_row['c2'], my_row['n1'], my_row['n2']), axis=1)
print(df)

输出