【问题标题】:Apply function across pandas dataframe (Kruskal-Wallice)跨 pandas 数据框应用函数 (Kruskal-Wallis)
【发布时间】:2022-01-19 12:11:08
【问题描述】:

我有一个数据框 df1,似乎无法在每行的列中应用此函数。

import scipy.stats as stats

d = {'sample1':[2,3,1,0,5], 'sample2':[3,0,0,2,3], 'sample3':[0,0,0,3,4]}
df1 = pd.DataFrame(d)


# create new column containing p_value from kruskal test.
df1['p_val'] = df1.apply(lambda x: stats.kruskal(x.sample1, x.sample2, x.sample3), axis=1)

我不断得到:

TypeError: len() of unsized object

df1:

sample1 sample2 sample3
0   2      3    0
1   3      0    0
2   1      0    0
3   0      2    3
4   5      3    4

期望的输出(显然我做了 p_values):

sample1 sample2 sample3  P_val
0   2      3    0        0.07
1   3      0    0        0.2
2   1      0    0        0.001
3   0      2    3        0.5
4   5      3    4        0.02

【问题讨论】:

    标签: python pandas statistics


    【解决方案1】:

    看起来scipy.kruskal 函数需要为您传入的 3 个参数中的每一个提供一个数字数组。

    因此,修改 lambda 函数以为行中的每个列条目生成一个列表就可以了

    df1['p_val'] = df1.apply(lambda x: stats.kruskal([x.sample1], [x.sample2], [x.sample3]), axis=1)
    

    【讨论】:

      【解决方案2】:

      它看起来像scipy.kruskal 在一维中进行论证 所以写

      df1['p_val'] = df1.apply(lambda x: stats.kruskal([x.sample1], [x.sample2], [x.sample3]), axis=1)
      

      它将解决错误 但作为 Kruskal-Wallis H 测试返回测试统计数据和 p 值, 所以,修改你的代码像

      df1['test_stat'],df1['p_val'] = df1.apply(lambda x: stats.kruskal([x.sample1], [x.sample2], [x.sample3]), axis=1)
      

      这将有助于检索不同字段中的两个值

      【讨论】:

        猜你喜欢
        • 2019-01-09
        • 2021-09-06
        • 2015-11-23
        • 2015-05-03
        • 2018-02-14
        • 1970-01-01
        • 1970-01-01
        • 2021-06-18
        • 1970-01-01
        相关资源
        最近更新 更多