Groupe De Corrélation De Pandas

en supposant que j'ai une base de données similaire à celle ci-dessous, Comment puis-je obtenir la corrélation entre 2 colonnes spécifiques et ensuite Grouper par la colonne 'ID'? Je crois que la méthode "corr" de Pandas trouve la corrélation entre toutes les colonnes. Si possible, je voudrais aussi savoir comment je pourrais trouver la corrélation "groupby" en utilisant le .apa fonction (p. np.corrélation.)

Ce que j'ai:

ID  Val1    Val2    OtherData   OtherData
A   5   4   x   x
A   4   5   x   x
A   6   6   x   x
B   4   1   x   x
B   8   2   x   x
B   7   9   x   x
C   4   8   x   x
C   5   5   x   x
C   2   1   x   x

Ce dont j'ai besoin:

ID  Correlation_Val1_Val2
A   0.12
B   0.22
C   0.05

Merci!

12
demandé sur EdChum 2015-03-11 17:00:43

2 réponses

vous avez assez bien compris toutes les pièces, juste besoin de les combiner:

>>> df.groupby('ID')[['Val1','Val2']].corr()

             Val1      Val2
ID                         
A  Val1  1.000000  0.500000
   Val2  0.500000  1.000000
B  Val1  1.000000  0.385727
   Val2  0.385727  1.000000

dans votre cas, imprimer un 2x2 pour chaque ID est excessivement verbeux. Je ne vois pas d'option pour imprimer une corrélation scalaire au lieu de la matrice entière, mais vous pouvez faire quelque chose de simple comme ceci si vous avez seulement deux variables:

>>> df.groupby('ID')[['Val1','Val2']].corr().iloc[0::2,-1]

ID       
A   Val1    0.500000
B   Val1    0.385727

Pour le cas plus général de 3+ variables

pour 3 variables ou plus, il n'est pas simple de créer des résultats concis mais vous pourriez faire quelque chose comme ceci:

groups = list('Val1', 'Val2', 'Val3', 'Val4')
df2 = pd.DataFrame()
for i in range( len(groups)-1): 
    df2 = df2.append( df.groupby('ID')[groups].corr().stack()
                        .loc[:,groups[i],groups[i+1]:].reset_index() )

df2.columns = ['ID', 'v1', 'v2', 'corr']
df2.set_index(['ID','v1','v2']).sort_index()

notez que si nous n'avions pas le groupby élément, il serait très simple d'utilisation supérieure ou inférieure en fonction triangle de numpy. Mais puisque cet élément est présent, il n'est pas si facile de produire des résultats concis d'une manière aussi élégante que je peux dire.

13
répondu JohnE 2018-07-25 09:36:17

dans la réponse ci-dessus; puisque ix a été déprécié, utilisez plutôt iloc avec quelques modifications mineures:

df.groupby('ID')[['Val1','Val2']].corr().iloc[0::2][['Val2']] # to get pandas DataFrame

ou

df.groupby('ID')[['Val1','Val2']].corr().iloc[0::2]['Val2'] # to get pandas Series
1
répondu Ravaging Care 2018-07-25 08:15:05