2015-07-29 9 views
5

Erstellt zwei Serien: s1 und s2 von df.Multiply zwei Pandas-Serie mit nicht übereinstimmenden Indizes

Beide haben die gleiche Länge, aber unterschiedliche Indizes. s1.multiply(s2) verknüpft die nicht übereinstimmenden Indizes, anstatt mit ihnen zu multiplizieren.

Ich möchte nur entrywise s1 gegen s2 multiplizieren, die nicht übereinstimmenden Indizes ignorieren.

Ich könnte s1.reset_index() und s2.reset_index() ausführen und dann die Spalte, die ich von diesen beiden dfs will, da es den ursprünglichen Index in eine separate Spalte verwandelt, aber das ist langweilig und ich dachte, es könnte eine einfachere Möglichkeit, es zu tun.

s1.multiply(s2, axis='columns') 

scheint nicht

+0

Sie zu einem numpy Array umwandeln denen Ignoriere den Index mit 'values':' s1.values.mul (s2.values) '. – JohnE

+0

Dank John, das funktioniert tatsächlich, um die Werte der Serie zu multiplizieren. Leider konvertiert es die Serie in ein numpliges Array. Weißt du, wie man den ganzen Prozess mit Serien halten kann, statt zu num- py Arrays und dann zurück zu Serien (result = pandas.Series (s1.values ​​* s2.values))? – intdt

+0

's1 * s2.values' sollte funktionieren – EdChum

Antwort

1

ich mit reset_index() denke, zur Arbeit zu gehen ist die Art und Weise, aber es gibt eine Option, um den Index zu löschen, ist es nicht in die Datenrahmen zurückzudrängen.

So:

s1 = pd.Series([1,2,3,4,5,6,7], index=[52,34,3,53,636,7,4]) 
52  1 
34  2 
3  3 
53  4 
636 5 
7  6 
4  7 
dtype: int64 

s1.reset_index(drop=True) 
0 1 
1 2 
2 3 
3 4 
4 5 
5 6 
6 7 
dtype: int64 

Der Grund, warum ich favorisieren den reset_index() Ansatz vor dem anderen vorgeschlagenen Ansatz mit einfach durch Wert multipliziert

s1 * s2.values 

ist, dass dies nicht sehr explizit ist. Diese Zeile sagt mir nicht, dass es ein Indexproblem gibt, das Sie lösen.

Während diese Linie sehr explizit die Geschichte erzählt, dass Sie einen Index Problem zu lösen:

s1.reset_index(drop=True) * s2.reset_index(drop=True) 

Oder es brechen, um mehrere Zeilen nach unten:

s1.reset_index(inplace=True, drop=True) 
s2.reset_index(inplace=True, drop=True) 
s1 * s2