Tengo el siguiente marco de datos de pandas Top15 :
Creo una columna que estima la cantidad de documentos citables por persona:
Top15['PopEst'] = Top15['Energy Supply'] / Top15['Energy Supply per Capita'] Top15['Citable docs per Capita'] = Top15['Citable documents'] / Top15['PopEst'] Quiero saber la correlación entre el número de documentos citables per cápita y el suministro de energía per cápita. Así que uso el método .corr() (correlación de Pearson):
data = Top15[['Citable docs per Capita','Energy Supply per Capita']] correlation = data.corr(method='pearson') Quiero devolver un solo número, pero el resultado es:
Sin datos reales, es difícil responder a la pregunta, pero supongo que está buscando algo como esto:
Top15['Citable docs per Capita'].corr(Top15['Energy Supply per Capita']) Eso calcula la correlación entre sus dos columnas 'Citable docs per Capita' y 'Energy Supply per Capita' .
Para dar un ejemplo:
import pandas as pd df = pd.DataFrame({'A': range(4), 'B': [2*i for i in range(4)]}) AB 0 0 0 1 1 2 2 2 4 3 3 6Entonces
df['A'].corr(df['B']) da 1 como se esperaba.
Ahora, si cambia un valor, por ejemplo
df.loc[2, 'B'] = 4.5 AB 0 0 0.0 1 1 2.0 2 2 4.5 3 3 6.0El comando
df['A'].corr(df['B'])devoluciones
0.99586que todavía está cerca de 1, como se esperaba.
Si aplica .corr directamente a su marco de datos, devolverá todas las correlaciones por pares entre sus columnas ; es por eso que luego observas 1s en la diagonal de tu matriz (cada columna está perfectamente correlacionada consigo misma).
df.corr()por lo tanto regresará
AB A 1.000000 0.995862 B 0.995862 1.000000En el gráfico que muestra, solo se representa la esquina superior izquierda de la matriz de correlación (supongo).
Puede haber casos en los que obtenga NaN s en su solución: consulte esta publicación para ver un ejemplo.
Si desea filtrar las entradas por encima o por debajo de un determinado umbral, puede consultar esta pregunta . Si desea trazar un mapa de calor de los coeficientes de correlación, puede verificar esta respuesta y, si luego se encuentra con el problema con las etiquetas de eje superpuestas, consulte la siguiente publicación .
Me encontré con el mismo problema. Citable Documents per Person era flotante, y python lo omite de alguna manera por defecto. Todas las demás columnas de mi marco de datos estaban en formatos numpy, así que lo resolví convirtiendo la columna a np.float64
Top15['Citable Documents per Person']=np.float64(Top15['Citable Documents per Person'])Recuerde que es exactamente la columna que usted mismo calculó
Mi solución sería después de convertir datos a tipo numérico:
Top15[['Citable docs per Capita','Energy Supply per Capita']].corr()