在 pandas 数据帧上使用 ttest_ind 时遇到问题
Trouble using ttest_ind on pandas dataframe
我目前正在使用以下形式的数据框:
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 然后 return 一个新的数据帧,其结果如下所示:
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 然后 return 将 p-vaule 放入另一列。
非常感谢任何帮助。
您可以使用 scipy.stats.ttest_ind
方法。
方法 returns 与 (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
尤里卡!
从我在问题中发布的内容开始:
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']]
我首先找出列表中的对之间的区别:
df2 = df.groupby('Symbol').agg(np.mean)
for pair in lst:
df2[pair[0]+'-'+pair[1]] = df2[pair[0]] - df2[pair[1]]
然后我列出 'Symbols' 并循环遍历它以创建一个新的数据帧,其中仅包含用于 t 检验的相同符号,然后我将其附加到具有差异的数据帧:
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]
这导致数据帧 (df2):
C1 C2 C3 C4 C1-C2 C1-C3 C3-C4 C1-C2 pval C1-C3 pval C3-C4 pval
Symbol
A 12.1750 11.500 15.675 9.400 0.6750 -3.5000 6.275 0.032625 2.636815e-02 1.442745e-02
B 8.2075 10.975 16.500 7.925 -2.7675 -8.2925 8.575 0.000124 9.784611e-09 2.636731e-08
然后我可以将具有平均值的列(C1,C2 ...)删除以获得我想要的输出。
我目前正在使用以下形式的数据框:
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 然后 return 一个新的数据帧,其结果如下所示:
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 然后 return 将 p-vaule 放入另一列。
非常感谢任何帮助。
您可以使用 scipy.stats.ttest_ind
方法。
方法 returns 与 (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
尤里卡!
从我在问题中发布的内容开始:
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']]
我首先找出列表中的对之间的区别:
df2 = df.groupby('Symbol').agg(np.mean)
for pair in lst:
df2[pair[0]+'-'+pair[1]] = df2[pair[0]] - df2[pair[1]]
然后我列出 'Symbols' 并循环遍历它以创建一个新的数据帧,其中仅包含用于 t 检验的相同符号,然后我将其附加到具有差异的数据帧:
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]
这导致数据帧 (df2):
C1 C2 C3 C4 C1-C2 C1-C3 C3-C4 C1-C2 pval C1-C3 pval C3-C4 pval
Symbol
A 12.1750 11.500 15.675 9.400 0.6750 -3.5000 6.275 0.032625 2.636815e-02 1.442745e-02
B 8.2075 10.975 16.500 7.925 -2.7675 -8.2925 8.575 0.000124 9.784611e-09 2.636731e-08
然后我可以将具有平均值的列(C1,C2 ...)删除以获得我想要的输出。