如何将两个样本比例测试应用于 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
以应用于行而不是列
我认为您可能将 count
和 n_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)
输出
我正在尝试对 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
以应用于行而不是列
我认为您可能将 count
和 n_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)
输出