我有表单的dataframe df
class_1_frequency class_2_frequency
group_1 20 10
group_2 60 25
..
group_n 50 15 假设class_1共有70个成员,class_2有30个成员。
对于每一行(group_1、group_2、..group_n),我希望创建应急表(最好是动态的),然后执行一个chisquare试验来计算p值。
例如,对于group_1,引擎盖下的应急表如下所示:
class_1 class_2
group_1_present 20 10
group_1_absent 70-20 30-10另外,我知道应急()是chisquare的适当函数,但我无法将它应用到上下文中。我看过以前讨论过的问题,如:这里和这里。
实现这一目标的最有效方法是什么?
发布于 2019-01-18 13:38:54
您可以在apply上利用pd.DataFrame函数。它允许将任意函数应用于DataFrame的列或行。使用您的例子:
df = pd.DataFrame([[20, 10], [60, 25], [50, 15]])要生成应急表,可以使用lambda和一些向量操作
>>> members = np.array([70, 30])
>>> df.apply(lambda x: np.array([x, members-x]), axis=1)
0 [[20, 10], [50, 20]]
1 [[60, 25], [10, 5]]
2 [[50, 15], [20, 15]]当然,这可以用scipy函数包装。
df.apply(lambda x: chi2_contingency(np.array([x, members-x])), axis=1)这会产生所有可能的返回值,但是通过切片输出,可以指定想要的返回值,例如,留下预期的数组。生成的系列还可以转换为DataFrame。
>>> s = df.apply(lambda x: chi2_contingency(np.array([x, members-x]))[:-1], axis=1)
>>> s
0 (0.056689342403628114, 0.8118072280034329, 1)
1 (0.0, 1.0, 1)
2 (3.349031920460492, 0.06724454934343391, 1)
dtype: object
>>> s.apply(pd.Series)
0 1 2
0 0.056689 0.811807 1.0
1 0.000000 1.000000 1.0
2 3.349032 0.067245 1.0现在我不知道这种方法的执行效率,但我相信那些实现了这些功能的人。而且最有可能的是速度没有那么关键。但至少在某种意义上它是有效的,因为它(假设)容易理解,而且写得很快。
https://stackoverflow.com/questions/54253573
复制相似问题