2016-05-22 15 views
0

Ich bemerkte frühere Versionen meiner question schlug die Verwendung von Abfragen, aber ich habe eindeutige Datenrahmen, die nicht die gleichen Spaltennamen haben. Ich möchte diese Formel codieren, ohne Schleifen für und mit nur Funktion anwenden:Pandas gelten Lambda mehrere Argumente keine Abfrage andere Datenrahmen

enter image description here

Hier werden die Variablen initialisiert. mu = μ und die anderen Variablen sind wie folgt:

mu=pd.DataFrame(0, index=['A','B','C'], columns=['x','y']) 
pij=pd.DataFrame(np.random.randn(500,3),columns=['A','B','C']) 
X=pd.DataFrame(np.random.randn(500,2),columns=['x','y']) 

nächst ich bin in der Lage verschachtelt verwenden, um Schleifen dieses zu lösen

for j in range(len(mu)): 
    for i in range(len(X)): 
     mu.ix[j,:]+=pij.ix[i,j]*X.ix[i,['x','y']] 
    mu.ix[j,:]=(mu.ix[j,:])/(pij.ix[:,j].sum()) 

mu 
      x   y 
A 0.147804 0.169263 
B -0.299590 -0.828494 
C -0.199637 0.363423 

Meine Frage ist, ob es möglich ist, die verschachtelten nicht verwenden for loops oder entfernen Sie sogar eine for loop, um dies zu lösen. Ich habe schwache Versuche vergeblich gemacht.

Sogar meine ersten Versuche führen zu mehreren NaNs.

Antwort

1

Der eingefügte Code deutet an, dass der Index auf mu auf der linken Seite der Formel j bedeutet, also nehme ich an, dass dies der Fall ist.

Da Sie zufällige Matrizen für Ihr Beispiel erstellt haben, werden meine Ergebnisse anders ausfallen als Ihre, aber ich habe überprüft, dass der eingefügte Code dieselben Ergebnisse liefert wie mein Code in den von mir generierten Matrizen.

>>> num = pij.transpose().dot(X) 
>>> num 
      x   y 
A -30.352924 -22.405490 
B 14.889298 -16.768464 
C -24.671337 9.092102 

Der Nenner ist einfach summing over columns::

>>> denom = pij.sum() 
>>> denom 
A 23.460325 
B 20.106702 
C -46.519167 
dtype: float64 

Dann wird die "Teilung" ist element-wise division by column

Der Zähler der RHS der Formel mit den entsprechenden transpose und matrix multiplication berechnet werden:

>>> num.divide(denom, axis='index') 
      x   y 
A -1.293798 -0.955037 
B 0.740514 -0.833974 
C 0.530348 -0.195449 
0

Ich würde normalisieren pij zuerst dann nehmen Sie innere Produkt mit X. Die Formel sieht wie folgt aus:

mu = (pij/pij.sum()).T.dot(X) 
Verwandte Themen