【问题标题】:How to perform chisquare tests on rows of pandas dataframes?如何对熊猫数据框行进行卡方检验?
【发布时间】:2019-01-18 11:58:18
【问题描述】:

我有一个 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 test 来评估 p 值。

例如,对于 group_1,引擎盖下的列联表如下所示:

                   class_1      class_2
group_1_present      20           10
group_1_absent     70-20         30-10

另外,我知道scipy.stats.chi2_contingency() 是适合卡方的函数,但我无法将它应用到我的上下文中。我看过之前讨论过的问题,例如:herehere

实现这一目标的最有效方法是什么?

【问题讨论】:

    标签: python pandas numpy scipy statistics


    【解决方案1】:

    您可以利用pd.DataFrame 上的apply 功能。它允许将任意函数应用于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
    

    现在我不知道这种方法的执行效率,但我相信那些实现了这些功能的人。而且很可能速度并不那么关键。但它至少在某种意义上是有效的,因为它(假设)易于理解且编写速度快。

    【讨论】:

      猜你喜欢
      • 2017-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-12
      • 2017-08-13
      • 1970-01-01
      • 2021-08-17
      • 1970-01-01
      相关资源
      最近更新 更多