2016-04-08 6 views
2

Ich habe zwei Pandas Serie, die jeweils mit einem anderen Index:Wie verbreitet man Pandas-Serien mit verschiedenen Indizes?

In [2]: a = pd.Series(range(5), index=pd.Index(list('abcde'), name='index')) 
In [3]: b = pd.Series(range(4), index=pd.Index(list('ABCD'), name='BIG_INDEX')) 

Was nach dem Vorbild der a.mul(b, axis=1) etwas tun, ich möchte Pandas instruieren b entlang der Achse 1 zu übertragen, bevor sie eine ufunc Durchführung (zB multiplizieren, erhöhen auf die Macht von, etc). Gibt es einen besseren Weg dies zu tun als mit "Anwenden"?

In [4]: a.apply(lambda x: x*b) 
Out[4]: 
BIG_INDEX A B C D 
index 
a   0 0 0 0 
b   0 1 2 3 
c   0 2 4 6 
d   0 3 6 9 
e   0 4 8 12 

Antwort

3

könnten Sie numpy.outer verwenden, um die Berechnung auszuführen, als ob a und b Arrays waren:

In [285]: pd.DataFrame(np.outer(a, b), columns=b.index, index=a.index) 
Out[285]: 
BIG_INDEX A B C D 
index     
a   0 0 0 0 
b   0 1 2 3 
c   0 2 4 6 
d   0 3 6 9 
e   0 4 8 12 

Dies ist schneller als a.apply(lambda x: x*b) aufrufen.


By the way, alle NumPy ufuncs come with 5 methods: outer, accumulate, reduce, reduceat und at. So ein anderer Weg, um die Lösung oben zu schreiben, ist

In [34]: pd.DataFrame(np.multiply.outer(a, b), columns=b.index, index=a.index) 
Out[36]: 
BIG_INDEX A B C D 
index     
a   0 0 0 0 
b   0 1 2 3 
c   0 2 4 6 
d   0 3 6 9 
e   0 4 8 12 

Und wenn diese Art und Weise geschrieben, es ist klar, wie die gleiche Idee zu jedem NumPy ufunc anzuwenden. Zum Beispiel zu machen und zusätzlich Tisch aus a und b, ruft np.add ‚s outer Methode:

In [37]: pd.DataFrame(np.add.outer(a, b), columns=b.index, index=a.index) 
Out[37]: 
BIG_INDEX A B C D 
index     
a   0 1 2 3 
b   1 2 3 4 
c   2 3 4 5 
d   3 4 5 6 
e   4 5 6 7 
+0

Sorry - ich war nicht super klar. Ich würde gerne wissen, ob es eine allgemeine Lösung für dieses Problem gibt, insbesondere für alle zwei Argumente ufuncs (z. B. mul, div, add, sub, pow, etc.). Im Wesentlichen besteht das Problem darin, dass Sie bei Berechnungen mit numperartigen Matrizen, z. B. einer (4x1) -Matrix und einer (1x5) -Matrix, diese Operationen ausführen können und die Übertragung automatisch erfolgt. Aber mit Serien, sagen wir von Größen (4,) und (5,), können Sie nicht mit dem Mismatch umgehen, ohne zuerst die Werte in ein numpiges Format zu konvertieren. Irgendwie in der Nähe? – delgadom

+1

Im Allgemeinen versuchen Pandas-Operationen, ** auf die NDFrame-Indizes auszurichten **. In den Operationen, die Sie erwägen (wie die obige), möchten Sie den Serienindex ignorieren und die * Werte * wie bei NumPy übertragen. Dafür ist Pandas nicht da. Wann immer Sie die Daten als indexloses Array behandeln möchten, verwenden Sie NumPy not Pandas. – unutbu

+0

Nun, ich möchte die Indizes nicht wirklich ignorieren ... Ich möchte sie beibehalten, während ich einen neuen Index ausstrahle. Es scheint, als ob der beste Weg ist, eine Abstraktion Ihrer Methode zu verwenden, zB: 'outer_opr = Lambda x, y, opr: pd.Datenrahmen (opr (x.values.reshape ((len (x), 1)) , y.values.reshape ((1, len (y)))), index = x.index, Spalten = y.index) ' – delgadom

Verwandte Themen