在熊猫数据框上使用ttest_ind遇到问题

时间:2019-03-16 13:43:07

标签: python pandas dataframe t-test

我目前正在使用以下格式的数据框:

import pandas as pd
import numpy as np
df = pd.DataFrame([['A', 12.1, 11.4, 15.1, 9.9], ['B', 8.3, 10.3, 16.6, 7.8], ['B', 7.8, 11.1, 16.3, 8.4], 
                   ['B', 8.6, 10.9, 16.4, 8.1], ['A', 12.25, 11.6, 16.25, 8.9], ['B', 8.13, 11.6, 16.7, 7.4]
                  ], columns = ['Symbol', 'C1','C2', 'C3', 'C4'])

还有一个列表列表,其中包括我想进行的各列比较:

lst = [['C1','C2'], ['C1','C3'], ['C3','C4']]

我正在尝试为每次比较计算均值(重复符号)的差,并执行ttest_ind然后返回一个新的数据框,其结果如下所示:

df2 = pd.DataFrame([['A', 0.675, 'pval here', -3.5, 'pval here',6.275,'pval here'], 
                    ['B', -2.7675, 'pval here', -8.2925, 'pval here', 8.575 , 'pval here']], 
                   columns = ['Symbol', 'C1-C2','C1-C2 pval', 'C1-C3', 'C1-C3 pval', 'C3-C4','C3-C4 pval'])

使用groupby来获取均值,然后循环遍历列表对,从而发现均值之间的差异有些简单:

df = df.groupby('Symbol').agg(np.mean)
for pair in lst:
    df[pair[0]+'-'+pair[1]] = df[pair[0]] - df[pair[1]]

但是我一直被困在应用ttest_ind,然后将p值返回到另一列。

我们非常感谢您的协助。

2 个答案:

答案 0 :(得分:1)

您可以为此使用方法scipy.stats.ttest_ind

该方法返回带有(t-statistic, p-value)的元组。因此,我们可以像下面这样访问索引为1的p-value

# Dataframe I start with, given by OP
df = df.groupby('Symbol').agg(np.mean)
for pair in lst:
    df[pair[0]+'-'+pair[1]] = df[pair[0]] - df[pair[1]]

print(df)
             C1      C2      C3     C4   C1-C2   C1-C3  C3-C4
Symbol                                                       
A       12.1750  11.500  15.675  9.400  0.6750 -3.5000  6.275
B        8.2075  10.975  16.500  7.925 -2.7675 -8.2925  8.575
from scipy.stats import ttest_ind

lst = [['C1','C2'], ['C1','C3'], ['C3','C4']]

df_group = df.groupby('Symbol').sum()

for l in lst:
    df_group[l[0]+'-'+l[1]+' pval'] = ttest_ind(df_group[l[0]], df_group[l[1]])[1]

# Drop columns not needed anymore    
df = df_group.drop(['C1', 'C2', 'C3', 'C4'],axis=1)

# Sort columns to get expected output
df = df.reindex(sorted(df.columns), axis=1).reset_index()

print(df)
  Symbol   C1-C2  C1-C2 pval   C1-C3  C1-C3 pval  C3-C4  C3-C4 pval
0      A  0.6750    0.653228 -3.5000    0.100586  6.275    0.012706
1      B -2.7675    0.653228 -8.2925    0.100586  8.575    0.012706

答案 1 :(得分:0)

尤里卡!

从我在问题中发布的内容开始:

' '.join([x if x.isdigit() else x[::-1] for x in result.text.split()][::-1])

我首先在列表中找到两对之间的区别:

import pandas as pd
import numpy as np
from scipy.stats import ttest_ind
df = pd.DataFrame([['A', 12.1, 11.4, 15.1, 9.9], ['B', 8.3, 10.3, 16.6, 7.8], ['B', 7.8, 11.1, 16.3, 8.4], 
                   ['B', 8.6, 10.9, 16.4, 8.1], ['A', 12.25, 11.6, 16.25, 8.9], ['B', 8.13, 11.6, 16.7, 7.4]
                  ], columns = ['Symbol', 'C1','C2', 'C3', 'C4'])
lst = [['C1','C2'], ['C1','C3'], ['C3','C4']]

然后,我列出“符号”并循环遍历,以创建一个仅包含用于t检验的相同符号的新数据框,然后将其附加到具有差异的数据框:

df2 = df.groupby('Symbol').agg(np.mean)
for pair in lst:
    df2[pair[0]+'-'+pair[1]] = df2[pair[0]] - df2[pair[1]]

这将导致数据帧(df2):

lst2 = list(set(df.Symbol))
for item in lst2:
    df3 = df[df.Symbol == item]
    for pair in lst:
        df2.loc[item, pair[0]+'-'+pair[1]+' pval'] = ttest_ind(df3[pair[0]], df3[pair[1]])[1]

然后我可以将平均值(C1,C2 ...)的列放到该列中,以获得所需的输出。