如何在 DataFrame 中创建 for 循环

问题描述 投票:0回答:2

我有一个大数据框,我想使用

test_ind
运行一个 t 学生,它执行两组定量变量的平均差异。例如,比较对照组与治疗组的氧气水平。

问题是我有很多定量变量要运行,我想开发一个函数:

  1. 获取各组数据
  2. 运行 t stat
  3. 将数据放入数据框中

我有这段代码,但我不知道如何在其中添加循环

#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 

问题是我想要一个函数,从数据框中输入变量并运行代码,而不是不断地执行

python pandas statistics
2个回答

0
投票

如果我理解正确,我们可以使用嵌套字典理解来计算数据/测量组的每种可能组合的 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')
© www.soinside.com 2019 - 2024. All rights reserved.