【发布时间】: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