2017-04-18 5 views
2

I Pandas Datenrahmen haben, wie:Pandas gleiche Anzahl von jeder Reihe von Listen subtrahieren

df1['A'].ix[1:3] 
2017-01-01 02:00:00 [33, 34, 39] 
2017-01-01 03:00:00 [3, 43, 9] 

df2['B'].ix[1:3] 
2017-01-01 02:00:00 2 
2017-01-01 03:00:00 3 

ich folgendes ausführen möchten:

difference = df1 - df2 

Erwartetes Ergebnis ist:

(df1 - df2).ix[1:3] 
2017-01-01 02:00:00 [31, 32, 37] 
2017-01-01 03:00:00 [0, 40, 6] 

dh Subtraktionsnummer in df2 von der entsprechenden Liste in df1

Jede Liste von df1 haben gleiche Größe.

Ich kann nicht besser Weg denken als list comprehension.

Antwort

3

Sie könnten Ihre Spaltenwerte aus einer Liste zu einem numpy Array konvertieren und dann tun df1.A - df2.B:

df1.A = df1.A.map(np.array) 
difference = df1.A - df2.B 
+1

Einfach, aber sehr elegante Lösung! – MaxU

5

ich nicht sagen kann, was die Objekte in df1 sind. Könnte list vielleicht np.array sein? IDK?

Besser Ich eröffne mein eigenes Beispiel

A = pd.Series([[33, 34, 39], [3, 43, 9]]) 
B = pd.Series([2, 3]) 

Option 1
apply(np.asarray)

A.apply(np.asarray) - B 

0 [31, 32, 37] 
1  [0, 40, 6] 
dtype: object 

Option 2
hässliche, aber schneller, siehe unten

pd.Series((np.array(A.values.tolist()) - B.values[:, None]).tolist(), A.index) 

0 [31, 32, 37] 
1  [0, 40, 6] 
dtype: object 

Timing

enter image description here

+1

Ich mag dieses auch! – MaxU

+0

Kannst du den 'A.apply (np.asarray) - B' Teil einem Pandas Neuling erklären? Wandelt es das einfach in ein Array um (ich nehme an, 'np' ist numpy?)? Und wenn ja, warum sollte man das numplige Array gegenüber anderen Optionen wählen? Vielen Dank! – patrick

+2

@patrick 'apply' nimmt eine Funktion als Argument und wendet sie auf jedes Element der Reihe' A' an. Es erzeugt eine andere Reihe mit den gleichen Reihenindizes, aber anstelle der alten Werte von "A" erhält man stattdessen "np.asarray (x)", wobei "x" ein bestimmter Wert in "A" ist. Wir importieren fast immer "numpy as np". Grrs "np.array" funktioniert sehr ähnlich. – piRSquared

Verwandte Themen