pandas.DataFrame corrwith () metodo

Recientemente empecé a trabajar con pandas . ¿Puede alguien explicarme la diferencia en el comportamiento de la función .corrwith() con Series y DataFrame ?

Supongamos que tengo un DataFrame :

 frame = pd.DataFrame(data={'a':[1,2,3], 'b':[-1,-2,-3], 'c':[10, -10, 10]}) 

Y quiero calcular la correlación entre las características ‘a’ y todas las demás características. Puedo hacerlo de la siguiente manera:

 frame.drop(labels='a', axis=1).corrwith(frame['a']) 

Y el resultado será:

 b -1.0 c 0.0 

Pero código muy similar:

 frame.drop(labels='a', axis=1).corrwith(frame[['a']]) 

Generar tabla absolutamente diferente e inaceptable:

 a NaN b NaN c NaN 

Entonces, mi pregunta es: ¿por qué en el caso de DataFrame como segundo argumento obtenemos resultados tan extraños?

Lo que creo que estás buscando:

Digamos que su marco es:

 frame = pd.DataFrame(np.random.rand(10, 6), columns=['cost', 'amount', 'day', 'month', 'is_sale', 'hour']) 

Desea que las columnas de 'cost' y 'amount' estén correlacionadas con todas las demás columnas en cada combinación.

 focus_cols = ['cost', 'amount'] frame.corr().filter(focus_cols).drop(focus_cols) 

introduzca la descripción de la imagen aquí

Respondiendo a lo que preguntaste:

Calcule la correlación por pares entre filas o columnas de dos objetos DataFrame.

Parámetros:

otro : DataFrame

eje: {0 o ‘índice’, 1 o ‘columnas’},

valor predeterminado 0 0 o ‘índice’ para calcular en columnas, 1 o ‘columnas’ para obtener datos en filas: booleano, valores predeterminados que faltan valores faltantes en el resultado, valores predeterminados en la unión de todos Devoluciones: correls: Series

corrwith se comporta de manera similar a add , sub , mul , div en el sentido de que espera encontrar un DataFrame o una Series está pasando en other pesar de la documentación que dice solo DataFrame .

Cuando other es una Series , transmite esa serie y las coincidencias a lo largo del eje especificado por el axis , el valor predeterminado es 0. Por eso funcionó lo siguiente:

 frame.drop(labels='a', axis=1).corrwith(frame.a) b -1.0 c 0.0 dtype: float64 

Cuando other es un DataFrame , coincidirá con el eje especificado por el axis y correlacionará cada par identificado por el otro eje. Si lo hiciéramos:

 frame.drop('a', axis=1).corrwith(frame.drop('b', axis=1)) a NaN b NaN c 1.0 dtype: float64 

Solo c estaba en común y solo c calculó su correlación.

En el caso que haya especificado:

 frame.drop(labels='a', axis=1).corrwith(frame[['a']]) 

frame[['a']] es un DataFrame debido a la [['a']] y ahora se ejecuta según las reglas de DataFrame en las que sus columnas deben coincidir con lo que se correlaciona. Pero usted deja caer explícitamente a del primer fotogtwig, luego se correlaciona con un DataFrame con nada más que a . El resultado es NaN para cada columna.

corrwith definido como DataFrame.corrwith(other, axis=0, drop=False) , por lo que el axis=0 por defecto, es decir, Compute pairwise correlation between columns of two **DataFrame** objects

Por lo tanto, los nombres / tags de las columnas deben ser los mismos en ambos DF:

 In [134]: frame.drop(labels='a', axis=1).corrwith(frame[['a']].rename(columns={'a':'b'})) Out[134]: b -1.0 c NaN dtype: float64 

NaN – significa (en este caso) que no hay nada con qué comparar / correlacionar, porque NO hay una columna llamada c en other DF

si pasa una serie como other , se traducirá (del enlace , que ha publicado en el comentario ) a:

 In [142]: frame.drop(labels='a', axis=1).apply(frame.a.corr) Out[142]: b -1.0 c 0.0 dtype: float64