我有一个大数据框,我想使用
test_ind
运行一个 t 学生,它执行两组定量变量的平均差异。例如,比较对照组与治疗组的氧气水平。
问题是我有很多定量变量要运行,我想开发一个函数:
我有这段代码,但我不知道如何在其中添加循环
#Sat Ox 3
#This part grabs the variables from the dataframe
grupoA= df[df['Grupo ']=='A']['Sat de oxigeno 3']
grupoB= df[df['Grupo ']=='B']['Sat de oxigeno 3']
#This one runs the t stat
x18=ttest_ind(grupoA, grupoB)
#This one puts the results in a dataframe
tablaT = pd.DataFrame((x7,x8,x9, x10, x11,x12,x13,x14,x15,x16,x17,x18),columns='T-test p-value'.split(),index='Frecuencia1 Frecuencia2 Frecuencia3 PresionSistolica1 PresionSistolica2 PresionSistolica3 PresionDiastolica1 PresionDiastolica2 PresionDiastolica3 SaturacionOx1 SaturacionOx2 SaturacionOx3'.split())
tablaT
问题是我想要一个函数,从数据框中输入变量并运行代码,而不是不断地执行
如果我理解正确,我们可以使用嵌套字典理解来计算数据/测量组的每种可能组合的 T 测试,然后使用
pandas.DataFrame.from_dict
获得最终的数据帧:
from scipy.stats import ttest_ind
import pandas as pd
import numpy as np
import re
df = pd.read_excel("basededatoslamaga-ejemplo.xlsx")
df.columns = [re.sub(' +', ' ', col.strip()) for col in df.columns]
list_of_measures = sorted(df.filter(regex='^Frecuencia|Presion|Sat').columns.tolist())
dico_v1 = {x: 's={:.6f}, p={:.6f}'.format(
*ttest_ind(df[df['Grupo']=='A'][x], df[df['Grupo']=='B'][x])) for x in list_of_measures}
dico_v2 = {key: list(map(str, re.sub('s=|p=', '', value).replace(' ', '').split(','))) for key, value in dico_v1.items()}
result_df = pd.DataFrame.from_dict(dico_v2, orient='index', columns=['T-test', 'p-value'], dtype=np.float64)
print(result_df)
T-test p-value
Frecuencia 1 -0.321216 0.749534
Frecuencia 2 1.085525 0.283470
Frecuencia 3 -1.365494 0.178885
Presion diastolica 1 -0.071333 0.943449
Presion diastolica 2 -1.372688 0.176652
Presion diastolica 3 -0.448372 0.656036
Presion sistolica -0.131486 0.895977
Presion sistolica 2 1.610477 0.114287
Presion sistolica 3 -0.462267 0.646117
Sat de oxigeno -0.471234 0.639750
Sat de oxigeno 3 0.603149 0.549438
Sat oxigeno 2 -0.023978 0.980976
如果需要某个功能,您可以尝试使用这个:
def ttest_groups(df, grp1, grp2):
list_of_measures = sorted(df.filter(regex='^Frecuencia|Presion|Sat').columns.tolist())
dico_v1 = {x: 's={:.5f}, p={:.5f}'.format(
*ttest_ind(df[df['Grupo']==grp1][x], df[df['Grupo']==grp2][x])) for x in list_of_measures}
dico_v2 = {key: list(map(str, re.sub('s=|p=', '', value).replace(' ', '').split(','))) for key, value in dico_v1.items()}
result_df = pd.DataFrame.from_dict(dico_v2, orient='index', columns=['T-test', 'p-value'], dtype=np.float64)
return result_df
ttest_groups(df, 'A', 'B')