¿Calcular la correlación entre todas las columnas de un DataFrame y todas las columnas de otro DataFrame?

Tengo un objeto DataFrame lleno de devoluciones de stock. Tengo otras industries objetos DataFrame llenas de retornos de la industria. Quiero encontrar la correlación de cada acción con cada industria.

 import numpy as np np.random.seed(123) df1=pd.DataFrame( {'s1':np.random.randn(10000), 's2':np.random.randn(10000) } ) df2=pd.DataFrame( {'i1':np.random.randn(10000), 'i2':np.random.randn(10000) } ) 

La manera costosa de hacer esto es fusionar los dos objetos DataFrame, calcular la correlación y luego desechar todas las existencias al stock y la industria a la industria. ¿Hay una manera más eficiente de hacer esto?

Y aquí hay una línea que usa apply en las columnas y evita los bucles nesteds. El principal beneficio es que apply construye el resultado en un DataFrame.

 df1.apply(lambda s: df2.corrwith(s)) 

Aquí hay una respuesta un poco más simple que la de JohnE que usa pandas de forma nativa en lugar de usar numpy.corrcoef. Como un bono adicional, no tiene que recuperar el valor de correlación de una matriz de correlación 2×2 tonta, porque la función de correlación serie a serie de los pandas simplemente devuelve un número, no una matriz.

 In [133]: for s in ['s1','s2']: ...: for i in ['i1','i2']: ...: print df1[s].corr(df2[i]) 

( Editar para agregar : en lugar de esta respuesta, por favor revise la respuesta de @ yt que se agregó más tarde pero que es claramente mejor).

Podría ir con numpy.corrcoef() que es básicamente lo mismo que corr en pandas, pero la syntax puede ser más adecuada para lo que usted quiere.

 for s in ['s1','s2']: for i in ['i1','i2']: print( 'corrcoef',s,i,np.corrcoef(df1[s],df2[i])[0,1] ) 

Que imprime

 corrcoef s1 i1 -0.00416977553597 corrcoef s1 i2 -0.0096393047035 corrcoef s2 i1 -0.026278689352 corrcoef s2 i2 -0.00402030582064 

Alternativamente, podría cargar los resultados en un dataframe con las tags apropiadas:

 cc = pd.DataFrame() for s in ['s1','s2']: for i in ['i1','i2']: cc = cc.append( pd.DataFrame( { 'corrcoef':np.corrcoef(df1[s],df2[i])[0,1] }, index=[s+'_'+i])) 

Que se parece a esto:

  corrcoef s1_i1 -0.004170 s1_i2 -0.009639 s2_i1 -0.026279 s2_i2 -0.004020