Je travaille actuellement avec une trame de données sous la forme:

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'])

Et une liste de listes qui inclut les comparaisons entre les colonnes que je voudrais faire:

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

J'essaie de calculer la différence des moyennes (symboles répétés) pour chaque comparaison ainsi que de faire un ttest_ind puis de retourner une nouvelle trame de données avec les résultats qui ressembleraient à:

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'])

Il est assez simple de trouver la différence entre les moyennes en utilisant groupby pour obtenir les moyennes, puis parcourez les paires de la liste comme suit:

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

Mais j'ai été coincé dans l'application de ttest_ind, puis le retour de la valeur de p dans une autre colonne.

Toute aide est grandement appréciée.

2
CPfeif13 16 mars 2019 à 16:43

2 réponses

Meilleure réponse

Eureka!

À partir de ce que j'ai publié dans la question:

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']]

Je trouve d'abord la différence entre les paires dans la liste:

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

Ensuite, je fais la liste des `` symboles '' et je le parcoure pour créer un nouveau cadre de données contenant uniquement le même symbole pour le test t que j'ajoute ensuite au cadre de données qui présente les différences:

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]

Il en résulte la trame de données (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

À laquelle alors je peux déposer les colonnes avec les moyennes (C1, C2 ...) pour obtenir ma sortie souhaitée.

0
CPfeif13 17 mars 2019 à 18:47