【问题标题】:Performing a T-Test on a Multiindex Pandas Dataframe对多索引 Pandas 数据框执行 T 检验
【发布时间】:2015-06-11 05:51:11
【问题描述】:

我希望对 pandas DataFrame 中的各种数据进行 T 检验。

我有一个这样组织的数据框:

df = pd.DataFrame({'a': {('0hr', '0.01um', 0): 12,
      ('0hr', '0.01um', 1): 10,
      ('0hr', '0.1um', 0): 8,
      ('0hr', '0.1um', 1): 6,
      ('0hr', 'Control', 0): 4,
      ('0hr', 'Control', 1): 2,
      ('24hr', '0.01um', 0): 18,
      ('24hr', '0.01um', 1): 15,
      ('24hr', '0.1um', 0): 12,
      ('24hr', '0.1um', 1): 9,
      ('24hr', 'Control', 0): 6,
      ('24hr', 'Control', 1): 3},
     'b': {('0hr', '0.01um', 0): 42,
      ('0hr', '0.01um', 1): 35,
      ('0hr', '0.1um', 0): 28,
      ('0hr', '0.1um', 1): 21,
      ('0hr', 'Control', 0): 14,
      ('0hr', 'Control', 1): 7,
      ('24hr', '0.01um', 0): 30,
      ('24hr', '0.01um', 1): 25,
      ('24hr', '0.1um', 0): 20,
      ('24hr', '0.1um', 1): 15,
      ('24hr', 'Control', 0): 10,
      ('24hr', 'Control', 1): 5}})

打印(df)

                     a   b
    0hr  0.01um  0  12  42
                 1  10  35
         0.1um   0   8  28
                 1   6  21
         Control 0   4  14
                 1   2   7
    24hr 0.01um  0  18  30
                 1  15  25
         0.1um   0  12  20
                 1   9  15
         Control 0   6  10
                 1   3   5

对于每一列(a、b 等),我想计算执行一个 t 检验,将给定时间范围内的控制与该时间范围内的其他测试进行比较。

例如:

[t, prob] = stats.ttest_ind( df.loc['0hr'].loc['Control'] , df.loc['0hr'].loc['Control'], 1, equal_var=True)
[t, prob] = stats.ttest_ind( df.loc['0hr'].loc['Control'] , df.loc['0hr'].loc['0.01um'], 1, equal_var=True)
[t, prob] = stats.ttest_ind( df.loc['0hr'].loc['Control'] , df.loc['0hr'].loc['0.1um'], 1, equal_var=True)
[t, prob] = stats.ttest_ind( df.loc['24hr'].loc['Control'] , df.loc['24hr'].loc['Control'], 1, equal_var=True)
[t, prob] = stats.ttest_ind( df.loc['24hr'].loc['Control'] , df.loc['24hr'].loc['0.01um'], 1, equal_var=True)
[t, prob] = stats.ttest_ind( df.loc['24hr'].loc['Control'] , df.loc['24hr'].loc['0.1um'], 1, equal_var=True)

我一直在尝试使用 df.apply 执行此操作,但我不确定正确的语法是什么。我想将结果返回到一个新的数据框中,其结构如下:

results = pd.DataFrame({'a': {('0hr', '0.01um', 't'): '-',
  ('0hr', '0.01um', 'prob'): '-',
  ('0hr', '0.1um', 't'): '-',
  ('0hr', '0.1um', 'prob'): '-',
  ('0hr', 'Control', 't'): '-',
  ('0hr', 'Control', 'prob'): '-',
  ('24hr', '0.01um', 't'): '-',
  ('24hr', '0.01um', 'prob'): '-',
  ('24hr', '0.1um', 't'): '-',
  ('24hr', '0.1um', 'prob'): '-',
  ('24hr', 'Control', 't'): '-',
  ('24hr', 'Control', 'prob'): '-'},
 'b': {('0hr', '0.01um', 't'): '-',
  ('0hr', '0.01um', 'prob'): '-',
  ('0hr', '0.1um', 't'): '-',
  ('0hr', '0.1um', 'prob'): '-',
  ('0hr', 'Control', 't'): '-',
  ('0hr', 'Control', 'prob'): '-',
  ('24hr', '0.01um', 't'): '-',
  ('24hr', '0.01um', 'prob'): '-',
  ('24hr', '0.1um', 't'): '-',
  ('24hr', '0.1um', 'prob'): '-',
  ('24hr', 'Control', 't'): '-',
  ('24hr', 'Control', 'prob'): '-'}})

【问题讨论】:

  • 您考虑过使用方差分析吗?这正是几个样本的 t 检验(很容易找到,例如在维基百科中)。我已经为您提供的数据集运行了它,结果是至少有一个样本不同。然后您运行 tukey 的 HSD 以了解它是哪一个(一个或多个)。这我也试过,但老实说我无法正确对待你的多索引。它会给你一个很好的列表,哪些样本是不同的,哪些不是。您真的需要您在问题中提出的格式的结果吗??
  • 我对结果的格式持开放态度,但我确实认为我需要一个 t 检验。这不是我的实验数据,所以我提供了所要求的内容……一个 2 尾独立 t 检验。我需要报告 p 值。这对我来说似乎很有意义,因为在任何给定时间只比较了两个数据集(例如 0.01um 与对照或 0.1um 与对照)。据我了解,方差分析用于比较多个数据集。
  • 重点是我觉得我没看懂,抱歉。好的,没有方差分析。但是,您将运行 24x2 t 检验?也许我还没有理解...无论如何,如果你想将一个值应用到一个多索引,它会像df.loc['0hr'].loc['0.01um']['t'] = xxx,假设't'是一个列。对于您的数据框,我直接在 ipython 中以df.loc['0hr'].loc['0.01um'].loc[0]['a'] = 3 尝试过。但如果我还是不明白,请告诉我!
  • 在上面的例子中会有 12 个 t 检验。 [t, prob] = stats.ttest_ind( df.loc['0hr'].loc['Control']['a'] , df.loc['0hr'].loc['Control']['a' ], 1, equal_var=True) 应该产生 p =1。其他测试是 [t, prob] = stats.ttest_ind( df.loc['0hr'].loc['Control']['a'] , df.loc['0hr'].loc['0.01um ']['a'], [t, prob] = stats.ttest_ind( df.loc['0hr'].loc['Control']['a'] , df.loc['0hr'].loc[ '0.1um']['a']等

标签: python python-2.7 pandas scipy


【解决方案1】:

好的,我不完全确定我是否理解这种情况,但我认为这将是处理 MultiIndex 的方式。

In [195]:

index = pd.MultiIndex.from_product([set(df.index.get_level_values(0)), set(df.index.get_level_values(1)), ['t', 'p']])
result = pd.DataFrame(columns=['a', 'b'], index=index)

for time in set(df.index.get_level_values(0)):
    for condition in set(df.index.get_level_values(1)) - set(['Control']):
        t, p = stats.ttest_ind( df.loc[time].loc['Control'] , df.loc[time].loc[condition], 1, equal_var=True)
        result.loc[(time, condition, 't')] = t
        result.loc[(time, condition, 'p')] = p
print result

结果:

                        a           b
0hr  Control t        NaN         NaN
             p        NaN         NaN
     0.01um  t -0.6706134   -1.412036
             p  0.5715365   0.2934382
     0.1um   t -0.8049845    -1.13842
             p  0.5053153   0.3729403
24hr Control t        NaN         NaN
             p        NaN         NaN
     0.01um  t  -2.529822   -3.137858
             p  0.1271284  0.08831539
     0.1um   t  -1.788854   -2.529822
             p  0.2155355   0.1271284

如果需要,您可以轻松填写​​控制行,但正如您所说,结果是可预测的。

希望对你有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 2013-06-02
    • 1970-01-01
    • 2017-08-19
    相关资源
    最近更新 更多